Add provider-neutral Elicit through the core Context API #197

Description

@taras

Motivation

Executable Markdown workflows need a provider-neutral way to pause for
structured human input. The document should describe what it is asking and the
valid response shape without choosing whether the interaction occurs in a web
form, terminal UI, Effection Inspector, automated test, or another host.

<Elicit> is a core contextual capability. It does not select an interaction
mode. The current CLI configuration uses the WebForm provider tracked in #195.

Implementation coordination

<Elicit> is an ordinary core TypeScript function component registered as a non-reserved default through #202's registration surface. Core resolves and validates props, owns as, creates the invocation boundary, and applies the validated return binding. The component receives no raw ComponentElement, expression map, binding environment, or as value and is not implemented through Component.expand.

Implementation depends on:

  1. Register function components and migrate legacy component handlers #202 PR 1 for scope-local registration and ordinary function-component resolution; and
  2. Add a bundled local WebForm component for schema-backed user input #195's reviewed live-form provider operation/adapter contract for the CLI's initial provider.

It does not wait for #202's Agent, Testing, assertion, or TestAgent migrations, and it does not depend on WebForm's browser-CI, website, or publication cleanup once the provider contract is available.

The component compiles the response schema before calling content(). It then presents the rendered request through the contextual Elicitation provider and returns the provider result through a declared broad JSON return schema. No schema, content, provider, or transport behavior is implemented a second time in an expansion handler.

Authoring contract

<Elicitschema={responseSchema}as="response">
Review the implementation plan and provide your decision.
</Elicit>
  • <Elicit> and the Elicitation Context API live in @executablemd/core.
  • schema and as are required.
  • schema accepts captured JSON text or an already structured draft-07 JSON
    Schema value.
  • Invocation content expands through content() into the request message presented by the configured provider.
  • A valid structured response binds directly to as.
  • The component emits nothing into the surrounding document.
  • The component exposes no mode, provider, WebForm, or RJSF-specific props.
  • Authors that intentionally require a browser form or RJSF uiSchema can use
    the public <WebForm> component from Add a bundled local WebForm component for schema-backed user input #195 directly.

Elicitation Context API

The contextual provider receives only the rendered request and compiled
response schema:

interfaceElicitationRequest{message: string;schema: JsonSchema;}

It returns an unknown structured value through an Effection operation.

Core owns:

  • schema parsing and compilation;
  • final response validation;
  • capture and source diagnostics;
  • durable response recording and replay; and
  • interruption through the surrounding Effection scope.

The provider owns only its live interaction and transport lifecycle. It does
not receive as, workflow run IDs, journal details, or component execution
identities.

The schema compiles before invocation content expands or the provider is contacted. An
invalid schema therefore produces no invocation-content effects and cannot open an
interaction.

When no provider is installed, <Elicit> fails immediately with a clear
no elicitation provider configured diagnostic.

Provider configuration

Provider selection happens only through the Context API.

  • The normal CLI composes the WebForm implementation from Add a bundled local WebForm component for schema-backed user input #195 as its current
    provider.
  • Applications embedding core explicitly install an elicitation provider.
  • Automated tests install scripted middleware through the same API.
  • Future terminal and Effection Inspector integrations replace the provider
    without changing executable Markdown.

Core has no dependency on React, RJSF, HTTP serving, browser launching, terminal
UI, or Inspector packages.

Response and lifecycle behavior

  • Core validates every provider result against the compiled schema before it
    binds or journals the value.
  • A schema-invalid provider result fails once with normalized validation
    diagnostics. Core does not silently invoke the provider again.
  • Interactive correction belongs inside a provider such as WebForm. Workflow
    retry belongs in visible bounded Markdown control flow.
  • Provider failures propagate with <Elicit> source context.
  • Halting the execution halts the provider operation and its owned resources.
  • <Elicit> has no protocol-defined approve, decline, cancel, or other
    outcomes. The schema defines every response option available to the user.
  • Cancellation of execution remains an Effection lifecycle event unless the
    document explicitly models cancellation as schema data.

Durability

Only the final validated response is journaled.

On replay, core restores the response and binding without expanding the request
content or invoking the configured provider. Provider choice and transport
details do not affect a completed replay.

Testing

Add a colocated Elicit.test.md document. It uses an eval block to apply
scripted Elicitation Context middleware within each <Test> scope, invokes
<Elicit> normally, and asserts the captured response.

Core exposes a test helper for constructing the scripted middleware. The eval
block supplies an ordered response queue rather than reimplementing a provider.
The helper:

  • consumes one response per live elicitation;
  • fails when an elicitation has no scripted response;
  • fails at test teardown when scripted responses remain unused; and
  • is removed automatically with the enclosing test scope.

No testing-only prop or special Markdown component is added. This eval use is
an explicitly approved exception for installing Context API middleware.

The Markdown tests cover:

  • schemas supplied as captured JSON and structured values;
  • invocation content becoming the provider request;
  • structured capture with no surrounding output;
  • multiple elicitations consuming scripted responses in order;
  • missing scripted responses; and
  • unused scripted responses.

Add lower-level automated tests for:

  • required props and capture name;
  • malformed and invalid draft-07 schemas;
  • schema compilation before invocation-content expansion;
  • no provider being configured;
  • the provider receiving only the rendered message and compiled schema;
  • provider results being validated again by core;
  • normalized diagnostics for invalid provider results;
  • invocation-content and provider failures propagating with source context;
  • interruption halting an active provider;
  • contextual provider override and restoration;
  • durable response recording;
  • full replay without invocation-content expansion or provider invocation; and
  • parity across Deno, Node, and Bun.

Documentation

  • Specify the component props, schema forms, output, validation, and lifecycle
    behavior in the core component reference.
  • Document the Elicitation Context API and show how hosts install providers.
  • Add a website example using <Elicit> for a human review decision.
  • Explain why provider selection is contextual rather than an author-facing
    mode.
  • Link the current WebForm provider in Add a bundled local WebForm component for schema-backed user input #195 while keeping browser-specific
    details out of the core contract.

Acceptance criteria

  • <Elicit> expresses a provider-neutral, schema-constrained request.
  • The provider is selected exclusively through the Context API.
  • Core validates both the schema and the provider response.
  • Invalid schemas cause no invocation-content or provider effects.
  • Missing providers and invalid responses produce actionable diagnostics.
  • Response options come only from the document's schema.
  • Interruption remains a lifecycle event.
  • Replay restores the response without repeating invocation-content or provider work.
  • Markdown tests configure scripted responses through eval-installed
    middleware with exact queue consumption.
  • Specification and website documentation ship in the same PR.

Not included

  • A mode prop or provider selection in Markdown.
  • RJSF uiSchema or other provider-specific presentation options.
  • Built-in approve, decline, or cancel actions.
  • Hidden retry or response repair.
  • The WebForm implementation and bundled assets tracked in Add a bundled local WebForm component for schema-backed user input #195.
  • Terminal UI and Effection Inspector providers.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
      Skip to content

      Add provider-neutral Elicit through the core Context API #197

      Description

      @taras

      Motivation

      Executable Markdown workflows need a provider-neutral way to pause for
      structured human input. The document should describe what it is asking and the
      valid response shape without choosing whether the interaction occurs in a web
      form, terminal UI, Effection Inspector, automated test, or another host.

      <Elicit> is a core contextual capability. It does not select an interaction
      mode. The current CLI configuration uses the WebForm provider tracked in #195.

      Implementation coordination

      <Elicit> is an ordinary core TypeScript function component registered as a non-reserved default through #202's registration surface. Core resolves and validates props, owns as, creates the invocation boundary, and applies the validated return binding. The component receives no raw ComponentElement, expression map, binding environment, or as value and is not implemented through Component.expand.

      Implementation depends on:

      1. Register function components and migrate legacy component handlers #202 PR 1 for scope-local registration and ordinary function-component resolution; and
      2. Add a bundled local WebForm component for schema-backed user input #195's reviewed live-form provider operation/adapter contract for the CLI's initial provider.

      It does not wait for #202's Agent, Testing, assertion, or TestAgent migrations, and it does not depend on WebForm's browser-CI, website, or publication cleanup once the provider contract is available.

      The component compiles the response schema before calling content(). It then presents the rendered request through the contextual Elicitation provider and returns the provider result through a declared broad JSON return schema. No schema, content, provider, or transport behavior is implemented a second time in an expansion handler.

      Authoring contract

      <Elicitschema={responseSchema}as="response">
      Review the implementation plan and provide your decision.
      </Elicit>
      • <Elicit> and the Elicitation Context API live in @executablemd/core.
      • schema and as are required.
      • schema accepts captured JSON text or an already structured draft-07 JSON
        Schema value.
      • Invocation content expands through content() into the request message presented by the configured provider.
      • A valid structured response binds directly to as.
      • The component emits nothing into the surrounding document.
      • The component exposes no mode, provider, WebForm, or RJSF-specific props.
      • Authors that intentionally require a browser form or RJSF uiSchema can use
        the public <WebForm> component from Add a bundled local WebForm component for schema-backed user input #195 directly.

      Elicitation Context API

      The contextual provider receives only the rendered request and compiled
      response schema:

      interfaceElicitationRequest{message: string;schema: JsonSchema;}

      It returns an unknown structured value through an Effection operation.

      Core owns:

      • schema parsing and compilation;
      • final response validation;
      • capture and source diagnostics;
      • durable response recording and replay; and
      • interruption through the surrounding Effection scope.

      The provider owns only its live interaction and transport lifecycle. It does
      not receive as, workflow run IDs, journal details, or component execution
      identities.

      The schema compiles before invocation content expands or the provider is contacted. An
      invalid schema therefore produces no invocation-content effects and cannot open an
      interaction.

      When no provider is installed, <Elicit> fails immediately with a clear
      no elicitation provider configured diagnostic.

      Provider configuration

      Provider selection happens only through the Context API.

      • The normal CLI composes the WebForm implementation from Add a bundled local WebForm component for schema-backed user input #195 as its current
        provider.
      • Applications embedding core explicitly install an elicitation provider.
      • Automated tests install scripted middleware through the same API.
      • Future terminal and Effection Inspector integrations replace the provider
        without changing executable Markdown.

      Core has no dependency on React, RJSF, HTTP serving, browser launching, terminal
      UI, or Inspector packages.

      Response and lifecycle behavior

      • Core validates every provider result against the compiled schema before it
        binds or journals the value.
      • A schema-invalid provider result fails once with normalized validation
        diagnostics. Core does not silently invoke the provider again.
      • Interactive correction belongs inside a provider such as WebForm. Workflow
        retry belongs in visible bounded Markdown control flow.
      • Provider failures propagate with <Elicit> source context.
      • Halting the execution halts the provider operation and its owned resources.
      • <Elicit> has no protocol-defined approve, decline, cancel, or other
        outcomes. The schema defines every response option available to the user.
      • Cancellation of execution remains an Effection lifecycle event unless the
        document explicitly models cancellation as schema data.

      Durability

      Only the final validated response is journaled.

      On replay, core restores the response and binding without expanding the request
      content or invoking the configured provider. Provider choice and transport
      details do not affect a completed replay.

      Testing

      Add a colocated Elicit.test.md document. It uses an eval block to apply
      scripted Elicitation Context middleware within each <Test> scope, invokes
      <Elicit> normally, and asserts the captured response.

      Core exposes a test helper for constructing the scripted middleware. The eval
      block supplies an ordered response queue rather than reimplementing a provider.
      The helper:

      • consumes one response per live elicitation;
      • fails when an elicitation has no scripted response;
      • fails at test teardown when scripted responses remain unused; and
      • is removed automatically with the enclosing test scope.

      No testing-only prop or special Markdown component is added. This eval use is
      an explicitly approved exception for installing Context API middleware.

      The Markdown tests cover:

      • schemas supplied as captured JSON and structured values;
      • invocation content becoming the provider request;
      • structured capture with no surrounding output;
      • multiple elicitations consuming scripted responses in order;
      • missing scripted responses; and
      • unused scripted responses.

      Add lower-level automated tests for:

      • required props and capture name;
      • malformed and invalid draft-07 schemas;
      • schema compilation before invocation-content expansion;
      • no provider being configured;
      • the provider receiving only the rendered message and compiled schema;
      • provider results being validated again by core;
      • normalized diagnostics for invalid provider results;
      • invocation-content and provider failures propagating with source context;
      • interruption halting an active provider;
      • contextual provider override and restoration;
      • durable response recording;
      • full replay without invocation-content expansion or provider invocation; and
      • parity across Deno, Node, and Bun.

      Documentation

      • Specify the component props, schema forms, output, validation, and lifecycle
        behavior in the core component reference.
      • Document the Elicitation Context API and show how hosts install providers.
      • Add a website example using <Elicit> for a human review decision.
      • Explain why provider selection is contextual rather than an author-facing
        mode.
      • Link the current WebForm provider in Add a bundled local WebForm component for schema-backed user input #195 while keeping browser-specific
        details out of the core contract.

      Acceptance criteria

      • <Elicit> expresses a provider-neutral, schema-constrained request.
      • The provider is selected exclusively through the Context API.
      • Core validates both the schema and the provider response.
      • Invalid schemas cause no invocation-content or provider effects.
      • Missing providers and invalid responses produce actionable diagnostics.
      • Response options come only from the document's schema.
      • Interruption remains a lifecycle event.
      • Replay restores the response without repeating invocation-content or provider work.
      • Markdown tests configure scripted responses through eval-installed
        middleware with exact queue consumption.
      • Specification and website documentation ship in the same PR.

      Not included

      • A mode prop or provider selection in Markdown.
      • RJSF uiSchema or other provider-specific presentation options.
      • Built-in approve, decline, or cancel actions.
      • Hidden retry or response repair.
      • The WebForm implementation and bundled assets tracked in Add a bundled local WebForm component for schema-backed user input #195.
      • Terminal UI and Effection Inspector providers.

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      No one assigned

        Labels

        No labels
        No labels

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
          Skip to content

          Add provider-neutral Elicit through the core Context API #197

          Description

          @taras

          Motivation

          Executable Markdown workflows need a provider-neutral way to pause for
          structured human input. The document should describe what it is asking and the
          valid response shape without choosing whether the interaction occurs in a web
          form, terminal UI, Effection Inspector, automated test, or another host.

          <Elicit> is a core contextual capability. It does not select an interaction
          mode. The current CLI configuration uses the WebForm provider tracked in #195.

          Implementation coordination

          <Elicit> is an ordinary core TypeScript function component registered as a non-reserved default through #202's registration surface. Core resolves and validates props, owns as, creates the invocation boundary, and applies the validated return binding. The component receives no raw ComponentElement, expression map, binding environment, or as value and is not implemented through Component.expand.

          Implementation depends on:

          1. Register function components and migrate legacy component handlers #202 PR 1 for scope-local registration and ordinary function-component resolution; and
          2. Add a bundled local WebForm component for schema-backed user input #195's reviewed live-form provider operation/adapter contract for the CLI's initial provider.

          It does not wait for #202's Agent, Testing, assertion, or TestAgent migrations, and it does not depend on WebForm's browser-CI, website, or publication cleanup once the provider contract is available.

          The component compiles the response schema before calling content(). It then presents the rendered request through the contextual Elicitation provider and returns the provider result through a declared broad JSON return schema. No schema, content, provider, or transport behavior is implemented a second time in an expansion handler.

          Authoring contract

          <Elicitschema={responseSchema}as="response">
          Review the implementation plan and provide your decision.
          </Elicit>
          • <Elicit> and the Elicitation Context API live in @executablemd/core.
          • schema and as are required.
          • schema accepts captured JSON text or an already structured draft-07 JSON
            Schema value.
          • Invocation content expands through content() into the request message presented by the configured provider.
          • A valid structured response binds directly to as.
          • The component emits nothing into the surrounding document.
          • The component exposes no mode, provider, WebForm, or RJSF-specific props.
          • Authors that intentionally require a browser form or RJSF uiSchema can use
            the public <WebForm> component from Add a bundled local WebForm component for schema-backed user input #195 directly.

          Elicitation Context API

          The contextual provider receives only the rendered request and compiled
          response schema:

          interfaceElicitationRequest{message: string;schema: JsonSchema;}

          It returns an unknown structured value through an Effection operation.

          Core owns:

          • schema parsing and compilation;
          • final response validation;
          • capture and source diagnostics;
          • durable response recording and replay; and
          • interruption through the surrounding Effection scope.

          The provider owns only its live interaction and transport lifecycle. It does
          not receive as, workflow run IDs, journal details, or component execution
          identities.

          The schema compiles before invocation content expands or the provider is contacted. An
          invalid schema therefore produces no invocation-content effects and cannot open an
          interaction.

          When no provider is installed, <Elicit> fails immediately with a clear
          no elicitation provider configured diagnostic.

          Provider configuration

          Provider selection happens only through the Context API.

          • The normal CLI composes the WebForm implementation from Add a bundled local WebForm component for schema-backed user input #195 as its current
            provider.
          • Applications embedding core explicitly install an elicitation provider.
          • Automated tests install scripted middleware through the same API.
          • Future terminal and Effection Inspector integrations replace the provider
            without changing executable Markdown.

          Core has no dependency on React, RJSF, HTTP serving, browser launching, terminal
          UI, or Inspector packages.

          Response and lifecycle behavior

          • Core validates every provider result against the compiled schema before it
            binds or journals the value.
          • A schema-invalid provider result fails once with normalized validation
            diagnostics. Core does not silently invoke the provider again.
          • Interactive correction belongs inside a provider such as WebForm. Workflow
            retry belongs in visible bounded Markdown control flow.
          • Provider failures propagate with <Elicit> source context.
          • Halting the execution halts the provider operation and its owned resources.
          • <Elicit> has no protocol-defined approve, decline, cancel, or other
            outcomes. The schema defines every response option available to the user.
          • Cancellation of execution remains an Effection lifecycle event unless the
            document explicitly models cancellation as schema data.

          Durability

          Only the final validated response is journaled.

          On replay, core restores the response and binding without expanding the request
          content or invoking the configured provider. Provider choice and transport
          details do not affect a completed replay.

          Testing

          Add a colocated Elicit.test.md document. It uses an eval block to apply
          scripted Elicitation Context middleware within each <Test> scope, invokes
          <Elicit> normally, and asserts the captured response.

          Core exposes a test helper for constructing the scripted middleware. The eval
          block supplies an ordered response queue rather than reimplementing a provider.
          The helper:

          • consumes one response per live elicitation;
          • fails when an elicitation has no scripted response;
          • fails at test teardown when scripted responses remain unused; and
          • is removed automatically with the enclosing test scope.

          No testing-only prop or special Markdown component is added. This eval use is
          an explicitly approved exception for installing Context API middleware.

          The Markdown tests cover:

          • schemas supplied as captured JSON and structured values;
          • invocation content becoming the provider request;
          • structured capture with no surrounding output;
          • multiple elicitations consuming scripted responses in order;
          • missing scripted responses; and
          • unused scripted responses.

          Add lower-level automated tests for:

          • required props and capture name;
          • malformed and invalid draft-07 schemas;
          • schema compilation before invocation-content expansion;
          • no provider being configured;
          • the provider receiving only the rendered message and compiled schema;
          • provider results being validated again by core;
          • normalized diagnostics for invalid provider results;
          • invocation-content and provider failures propagating with source context;
          • interruption halting an active provider;
          • contextual provider override and restoration;
          • durable response recording;
          • full replay without invocation-content expansion or provider invocation; and
          • parity across Deno, Node, and Bun.

          Documentation

          • Specify the component props, schema forms, output, validation, and lifecycle
            behavior in the core component reference.
          • Document the Elicitation Context API and show how hosts install providers.
          • Add a website example using <Elicit> for a human review decision.
          • Explain why provider selection is contextual rather than an author-facing
            mode.
          • Link the current WebForm provider in Add a bundled local WebForm component for schema-backed user input #195 while keeping browser-specific
            details out of the core contract.

          Acceptance criteria

          • <Elicit> expresses a provider-neutral, schema-constrained request.
          • The provider is selected exclusively through the Context API.
          • Core validates both the schema and the provider response.
          • Invalid schemas cause no invocation-content or provider effects.
          • Missing providers and invalid responses produce actionable diagnostics.
          • Response options come only from the document's schema.
          • Interruption remains a lifecycle event.
          • Replay restores the response without repeating invocation-content or provider work.
          • Markdown tests configure scripted responses through eval-installed
            middleware with exact queue consumption.
          • Specification and website documentation ship in the same PR.

          Not included

          • A mode prop or provider selection in Markdown.
          • RJSF uiSchema or other provider-specific presentation options.
          • Built-in approve, decline, or cancel actions.
          • Hidden retry or response repair.
          • The WebForm implementation and bundled assets tracked in Add a bundled local WebForm component for schema-backed user input #195.
          • Terminal UI and Effection Inspector providers.

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          No one assigned

            Labels

            No labels
            No labels

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              Add provider-neutral Elicit through the core Context API #197

              Description

              @taras

              Motivation

              Executable Markdown workflows need a provider-neutral way to pause for
              structured human input. The document should describe what it is asking and the
              valid response shape without choosing whether the interaction occurs in a web
              form, terminal UI, Effection Inspector, automated test, or another host.

              <Elicit> is a core contextual capability. It does not select an interaction
              mode. The current CLI configuration uses the WebForm provider tracked in #195.

              Implementation coordination

              <Elicit> is an ordinary core TypeScript function component registered as a non-reserved default through #202's registration surface. Core resolves and validates props, owns as, creates the invocation boundary, and applies the validated return binding. The component receives no raw ComponentElement, expression map, binding environment, or as value and is not implemented through Component.expand.

              Implementation depends on:

              1. Register function components and migrate legacy component handlers #202 PR 1 for scope-local registration and ordinary function-component resolution; and
              2. Add a bundled local WebForm component for schema-backed user input #195's reviewed live-form provider operation/adapter contract for the CLI's initial provider.

              It does not wait for #202's Agent, Testing, assertion, or TestAgent migrations, and it does not depend on WebForm's browser-CI, website, or publication cleanup once the provider contract is available.

              The component compiles the response schema before calling content(). It then presents the rendered request through the contextual Elicitation provider and returns the provider result through a declared broad JSON return schema. No schema, content, provider, or transport behavior is implemented a second time in an expansion handler.

              Authoring contract

              <Elicitschema={responseSchema}as="response">
              Review the implementation plan and provide your decision.
              </Elicit>
              • <Elicit> and the Elicitation Context API live in @executablemd/core.
              • schema and as are required.
              • schema accepts captured JSON text or an already structured draft-07 JSON
                Schema value.
              • Invocation content expands through content() into the request message presented by the configured provider.
              • A valid structured response binds directly to as.
              • The component emits nothing into the surrounding document.
              • The component exposes no mode, provider, WebForm, or RJSF-specific props.
              • Authors that intentionally require a browser form or RJSF uiSchema can use
                the public <WebForm> component from Add a bundled local WebForm component for schema-backed user input #195 directly.

              Elicitation Context API

              The contextual provider receives only the rendered request and compiled
              response schema:

              interfaceElicitationRequest{message: string;schema: JsonSchema;}

              It returns an unknown structured value through an Effection operation.

              Core owns:

              • schema parsing and compilation;
              • final response validation;
              • capture and source diagnostics;
              • durable response recording and replay; and
              • interruption through the surrounding Effection scope.

              The provider owns only its live interaction and transport lifecycle. It does
              not receive as, workflow run IDs, journal details, or component execution
              identities.

              The schema compiles before invocation content expands or the provider is contacted. An
              invalid schema therefore produces no invocation-content effects and cannot open an
              interaction.

              When no provider is installed, <Elicit> fails immediately with a clear
              no elicitation provider configured diagnostic.

              Provider configuration

              Provider selection happens only through the Context API.

              • The normal CLI composes the WebForm implementation from Add a bundled local WebForm component for schema-backed user input #195 as its current
                provider.
              • Applications embedding core explicitly install an elicitation provider.
              • Automated tests install scripted middleware through the same API.
              • Future terminal and Effection Inspector integrations replace the provider
                without changing executable Markdown.

              Core has no dependency on React, RJSF, HTTP serving, browser launching, terminal
              UI, or Inspector packages.

              Response and lifecycle behavior

              • Core validates every provider result against the compiled schema before it
                binds or journals the value.
              • A schema-invalid provider result fails once with normalized validation
                diagnostics. Core does not silently invoke the provider again.
              • Interactive correction belongs inside a provider such as WebForm. Workflow
                retry belongs in visible bounded Markdown control flow.
              • Provider failures propagate with <Elicit> source context.
              • Halting the execution halts the provider operation and its owned resources.
              • <Elicit> has no protocol-defined approve, decline, cancel, or other
                outcomes. The schema defines every response option available to the user.
              • Cancellation of execution remains an Effection lifecycle event unless the
                document explicitly models cancellation as schema data.

              Durability

              Only the final validated response is journaled.

              On replay, core restores the response and binding without expanding the request
              content or invoking the configured provider. Provider choice and transport
              details do not affect a completed replay.

              Testing

              Add a colocated Elicit.test.md document. It uses an eval block to apply
              scripted Elicitation Context middleware within each <Test> scope, invokes
              <Elicit> normally, and asserts the captured response.

              Core exposes a test helper for constructing the scripted middleware. The eval
              block supplies an ordered response queue rather than reimplementing a provider.
              The helper:

              • consumes one response per live elicitation;
              • fails when an elicitation has no scripted response;
              • fails at test teardown when scripted responses remain unused; and
              • is removed automatically with the enclosing test scope.

              No testing-only prop or special Markdown component is added. This eval use is
              an explicitly approved exception for installing Context API middleware.

              The Markdown tests cover:

              • schemas supplied as captured JSON and structured values;
              • invocation content becoming the provider request;
              • structured capture with no surrounding output;
              • multiple elicitations consuming scripted responses in order;
              • missing scripted responses; and
              • unused scripted responses.

              Add lower-level automated tests for:

              • required props and capture name;
              • malformed and invalid draft-07 schemas;
              • schema compilation before invocation-content expansion;
              • no provider being configured;
              • the provider receiving only the rendered message and compiled schema;
              • provider results being validated again by core;
              • normalized diagnostics for invalid provider results;
              • invocation-content and provider failures propagating with source context;
              • interruption halting an active provider;
              • contextual provider override and restoration;
              • durable response recording;
              • full replay without invocation-content expansion or provider invocation; and
              • parity across Deno, Node, and Bun.

              Documentation

              • Specify the component props, schema forms, output, validation, and lifecycle
                behavior in the core component reference.
              • Document the Elicitation Context API and show how hosts install providers.
              • Add a website example using <Elicit> for a human review decision.
              • Explain why provider selection is contextual rather than an author-facing
                mode.
              • Link the current WebForm provider in Add a bundled local WebForm component for schema-backed user input #195 while keeping browser-specific
                details out of the core contract.

              Acceptance criteria

              • <Elicit> expresses a provider-neutral, schema-constrained request.
              • The provider is selected exclusively through the Context API.
              • Core validates both the schema and the provider response.
              • Invalid schemas cause no invocation-content or provider effects.
              • Missing providers and invalid responses produce actionable diagnostics.
              • Response options come only from the document's schema.
              • Interruption remains a lifecycle event.
              • Replay restores the response without repeating invocation-content or provider work.
              • Markdown tests configure scripted responses through eval-installed
                middleware with exact queue consumption.
              • Specification and website documentation ship in the same PR.

              Not included

              • A mode prop or provider selection in Markdown.
              • RJSF uiSchema or other provider-specific presentation options.
              • Built-in approve, decline, or cancel actions.
              • Hidden retry or response repair.
              • The WebForm implementation and bundled assets tracked in Add a bundled local WebForm component for schema-backed user input #195.
              • Terminal UI and Effection Inspector providers.

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              No one assigned

                Labels

                No labels
                No labels

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions

                  , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
                  Skip to content

                  Add provider-neutral Elicit through the core Context API #197

                  Description

                  @taras

                  Motivation

                  Executable Markdown workflows need a provider-neutral way to pause for
                  structured human input. The document should describe what it is asking and the
                  valid response shape without choosing whether the interaction occurs in a web
                  form, terminal UI, Effection Inspector, automated test, or another host.

                  <Elicit> is a core contextual capability. It does not select an interaction
                  mode. The current CLI configuration uses the WebForm provider tracked in #195.

                  Implementation coordination

                  <Elicit> is an ordinary core TypeScript function component registered as a non-reserved default through #202's registration surface. Core resolves and validates props, owns as, creates the invocation boundary, and applies the validated return binding. The component receives no raw ComponentElement, expression map, binding environment, or as value and is not implemented through Component.expand.

                  Implementation depends on:

                  1. Register function components and migrate legacy component handlers #202 PR 1 for scope-local registration and ordinary function-component resolution; and
                  2. Add a bundled local WebForm component for schema-backed user input #195's reviewed live-form provider operation/adapter contract for the CLI's initial provider.

                  It does not wait for #202's Agent, Testing, assertion, or TestAgent migrations, and it does not depend on WebForm's browser-CI, website, or publication cleanup once the provider contract is available.

                  The component compiles the response schema before calling content(). It then presents the rendered request through the contextual Elicitation provider and returns the provider result through a declared broad JSON return schema. No schema, content, provider, or transport behavior is implemented a second time in an expansion handler.

                  Authoring contract

                  <Elicitschema={responseSchema}as="response">
                  Review the implementation plan and provide your decision.
                  </Elicit>
                  • <Elicit> and the Elicitation Context API live in @executablemd/core.
                  • schema and as are required.
                  • schema accepts captured JSON text or an already structured draft-07 JSON
                    Schema value.
                  • Invocation content expands through content() into the request message presented by the configured provider.
                  • A valid structured response binds directly to as.
                  • The component emits nothing into the surrounding document.
                  • The component exposes no mode, provider, WebForm, or RJSF-specific props.
                  • Authors that intentionally require a browser form or RJSF uiSchema can use
                    the public <WebForm> component from Add a bundled local WebForm component for schema-backed user input #195 directly.

                  Elicitation Context API

                  The contextual provider receives only the rendered request and compiled
                  response schema:

                  interfaceElicitationRequest{message: string;schema: JsonSchema;}

                  It returns an unknown structured value through an Effection operation.

                  Core owns:

                  • schema parsing and compilation;
                  • final response validation;
                  • capture and source diagnostics;
                  • durable response recording and replay; and
                  • interruption through the surrounding Effection scope.

                  The provider owns only its live interaction and transport lifecycle. It does
                  not receive as, workflow run IDs, journal details, or component execution
                  identities.

                  The schema compiles before invocation content expands or the provider is contacted. An
                  invalid schema therefore produces no invocation-content effects and cannot open an
                  interaction.

                  When no provider is installed, <Elicit> fails immediately with a clear
                  no elicitation provider configured diagnostic.

                  Provider configuration

                  Provider selection happens only through the Context API.

                  • The normal CLI composes the WebForm implementation from Add a bundled local WebForm component for schema-backed user input #195 as its current
                    provider.
                  • Applications embedding core explicitly install an elicitation provider.
                  • Automated tests install scripted middleware through the same API.
                  • Future terminal and Effection Inspector integrations replace the provider
                    without changing executable Markdown.

                  Core has no dependency on React, RJSF, HTTP serving, browser launching, terminal
                  UI, or Inspector packages.

                  Response and lifecycle behavior

                  • Core validates every provider result against the compiled schema before it
                    binds or journals the value.
                  • A schema-invalid provider result fails once with normalized validation
                    diagnostics. Core does not silently invoke the provider again.
                  • Interactive correction belongs inside a provider such as WebForm. Workflow
                    retry belongs in visible bounded Markdown control flow.
                  • Provider failures propagate with <Elicit> source context.
                  • Halting the execution halts the provider operation and its owned resources.
                  • <Elicit> has no protocol-defined approve, decline, cancel, or other
                    outcomes. The schema defines every response option available to the user.
                  • Cancellation of execution remains an Effection lifecycle event unless the
                    document explicitly models cancellation as schema data.

                  Durability

                  Only the final validated response is journaled.

                  On replay, core restores the response and binding without expanding the request
                  content or invoking the configured provider. Provider choice and transport
                  details do not affect a completed replay.

                  Testing

                  Add a colocated Elicit.test.md document. It uses an eval block to apply
                  scripted Elicitation Context middleware within each <Test> scope, invokes
                  <Elicit> normally, and asserts the captured response.

                  Core exposes a test helper for constructing the scripted middleware. The eval
                  block supplies an ordered response queue rather than reimplementing a provider.
                  The helper:

                  • consumes one response per live elicitation;
                  • fails when an elicitation has no scripted response;
                  • fails at test teardown when scripted responses remain unused; and
                  • is removed automatically with the enclosing test scope.

                  No testing-only prop or special Markdown component is added. This eval use is
                  an explicitly approved exception for installing Context API middleware.

                  The Markdown tests cover:

                  • schemas supplied as captured JSON and structured values;
                  • invocation content becoming the provider request;
                  • structured capture with no surrounding output;
                  • multiple elicitations consuming scripted responses in order;
                  • missing scripted responses; and
                  • unused scripted responses.

                  Add lower-level automated tests for:

                  • required props and capture name;
                  • malformed and invalid draft-07 schemas;
                  • schema compilation before invocation-content expansion;
                  • no provider being configured;
                  • the provider receiving only the rendered message and compiled schema;
                  • provider results being validated again by core;
                  • normalized diagnostics for invalid provider results;
                  • invocation-content and provider failures propagating with source context;
                  • interruption halting an active provider;
                  • contextual provider override and restoration;
                  • durable response recording;
                  • full replay without invocation-content expansion or provider invocation; and
                  • parity across Deno, Node, and Bun.

                  Documentation

                  • Specify the component props, schema forms, output, validation, and lifecycle
                    behavior in the core component reference.
                  • Document the Elicitation Context API and show how hosts install providers.
                  • Add a website example using <Elicit> for a human review decision.
                  • Explain why provider selection is contextual rather than an author-facing
                    mode.
                  • Link the current WebForm provider in Add a bundled local WebForm component for schema-backed user input #195 while keeping browser-specific
                    details out of the core contract.

                  Acceptance criteria

                  • <Elicit> expresses a provider-neutral, schema-constrained request.
                  • The provider is selected exclusively through the Context API.
                  • Core validates both the schema and the provider response.
                  • Invalid schemas cause no invocation-content or provider effects.
                  • Missing providers and invalid responses produce actionable diagnostics.
                  • Response options come only from the document's schema.
                  • Interruption remains a lifecycle event.
                  • Replay restores the response without repeating invocation-content or provider work.
                  • Markdown tests configure scripted responses through eval-installed
                    middleware with exact queue consumption.
                  • Specification and website documentation ship in the same PR.

                  Not included

                  • A mode prop or provider selection in Markdown.
                  • RJSF uiSchema or other provider-specific presentation options.
                  • Built-in approve, decline, or cancel actions.
                  • Hidden retry or response repair.
                  • The WebForm implementation and bundled assets tracked in Add a bundled local WebForm component for schema-backed user input #195.
                  • Terminal UI and Effection Inspector providers.

                  Activity

                  Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                  Metadata

                  Metadata

                  Assignees

                  No one assigned

                    Labels

                    No labels
                    No labels

                    Projects

                    No projects

                      Milestone

                      No milestone

                      Relationships

                      None yet

                      Development

                      No branches or pull requests

                      Issue actions

                      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                      Skip to content

                      Add provider-neutral Elicit through the core Context API #197

                      Description

                      @taras

                      Motivation

                      Executable Markdown workflows need a provider-neutral way to pause for
                      structured human input. The document should describe what it is asking and the
                      valid response shape without choosing whether the interaction occurs in a web
                      form, terminal UI, Effection Inspector, automated test, or another host.

                      <Elicit> is a core contextual capability. It does not select an interaction
                      mode. The current CLI configuration uses the WebForm provider tracked in #195.

                      Implementation coordination

                      <Elicit> is an ordinary core TypeScript function component registered as a non-reserved default through #202's registration surface. Core resolves and validates props, owns as, creates the invocation boundary, and applies the validated return binding. The component receives no raw ComponentElement, expression map, binding environment, or as value and is not implemented through Component.expand.

                      Implementation depends on:

                      1. Register function components and migrate legacy component handlers #202 PR 1 for scope-local registration and ordinary function-component resolution; and
                      2. Add a bundled local WebForm component for schema-backed user input #195's reviewed live-form provider operation/adapter contract for the CLI's initial provider.

                      It does not wait for #202's Agent, Testing, assertion, or TestAgent migrations, and it does not depend on WebForm's browser-CI, website, or publication cleanup once the provider contract is available.

                      The component compiles the response schema before calling content(). It then presents the rendered request through the contextual Elicitation provider and returns the provider result through a declared broad JSON return schema. No schema, content, provider, or transport behavior is implemented a second time in an expansion handler.

                      Authoring contract

                      <Elicitschema={responseSchema}as="response">
                      Review the implementation plan and provide your decision.
                      </Elicit>
                      • <Elicit> and the Elicitation Context API live in @executablemd/core.
                      • schema and as are required.
                      • schema accepts captured JSON text or an already structured draft-07 JSON
                        Schema value.
                      • Invocation content expands through content() into the request message presented by the configured provider.
                      • A valid structured response binds directly to as.
                      • The component emits nothing into the surrounding document.
                      • The component exposes no mode, provider, WebForm, or RJSF-specific props.
                      • Authors that intentionally require a browser form or RJSF uiSchema can use
                        the public <WebForm> component from Add a bundled local WebForm component for schema-backed user input #195 directly.

                      Elicitation Context API

                      The contextual provider receives only the rendered request and compiled
                      response schema:

                      interfaceElicitationRequest{message: string;schema: JsonSchema;}

                      It returns an unknown structured value through an Effection operation.

                      Core owns:

                      • schema parsing and compilation;
                      • final response validation;
                      • capture and source diagnostics;
                      • durable response recording and replay; and
                      • interruption through the surrounding Effection scope.

                      The provider owns only its live interaction and transport lifecycle. It does
                      not receive as, workflow run IDs, journal details, or component execution
                      identities.

                      The schema compiles before invocation content expands or the provider is contacted. An
                      invalid schema therefore produces no invocation-content effects and cannot open an
                      interaction.

                      When no provider is installed, <Elicit> fails immediately with a clear
                      no elicitation provider configured diagnostic.

                      Provider configuration

                      Provider selection happens only through the Context API.

                      • The normal CLI composes the WebForm implementation from Add a bundled local WebForm component for schema-backed user input #195 as its current
                        provider.
                      • Applications embedding core explicitly install an elicitation provider.
                      • Automated tests install scripted middleware through the same API.
                      • Future terminal and Effection Inspector integrations replace the provider
                        without changing executable Markdown.

                      Core has no dependency on React, RJSF, HTTP serving, browser launching, terminal
                      UI, or Inspector packages.

                      Response and lifecycle behavior

                      • Core validates every provider result against the compiled schema before it
                        binds or journals the value.
                      • A schema-invalid provider result fails once with normalized validation
                        diagnostics. Core does not silently invoke the provider again.
                      • Interactive correction belongs inside a provider such as WebForm. Workflow
                        retry belongs in visible bounded Markdown control flow.
                      • Provider failures propagate with <Elicit> source context.
                      • Halting the execution halts the provider operation and its owned resources.
                      • <Elicit> has no protocol-defined approve, decline, cancel, or other
                        outcomes. The schema defines every response option available to the user.
                      • Cancellation of execution remains an Effection lifecycle event unless the
                        document explicitly models cancellation as schema data.

                      Durability

                      Only the final validated response is journaled.

                      On replay, core restores the response and binding without expanding the request
                      content or invoking the configured provider. Provider choice and transport
                      details do not affect a completed replay.

                      Testing

                      Add a colocated Elicit.test.md document. It uses an eval block to apply
                      scripted Elicitation Context middleware within each <Test> scope, invokes
                      <Elicit> normally, and asserts the captured response.

                      Core exposes a test helper for constructing the scripted middleware. The eval
                      block supplies an ordered response queue rather than reimplementing a provider.
                      The helper:

                      • consumes one response per live elicitation;
                      • fails when an elicitation has no scripted response;
                      • fails at test teardown when scripted responses remain unused; and
                      • is removed automatically with the enclosing test scope.

                      No testing-only prop or special Markdown component is added. This eval use is
                      an explicitly approved exception for installing Context API middleware.

                      The Markdown tests cover:

                      • schemas supplied as captured JSON and structured values;
                      • invocation content becoming the provider request;
                      • structured capture with no surrounding output;
                      • multiple elicitations consuming scripted responses in order;
                      • missing scripted responses; and
                      • unused scripted responses.

                      Add lower-level automated tests for:

                      • required props and capture name;
                      • malformed and invalid draft-07 schemas;
                      • schema compilation before invocation-content expansion;
                      • no provider being configured;
                      • the provider receiving only the rendered message and compiled schema;
                      • provider results being validated again by core;
                      • normalized diagnostics for invalid provider results;
                      • invocation-content and provider failures propagating with source context;
                      • interruption halting an active provider;
                      • contextual provider override and restoration;
                      • durable response recording;
                      • full replay without invocation-content expansion or provider invocation; and
                      • parity across Deno, Node, and Bun.

                      Documentation

                      • Specify the component props, schema forms, output, validation, and lifecycle
                        behavior in the core component reference.
                      • Document the Elicitation Context API and show how hosts install providers.
                      • Add a website example using <Elicit> for a human review decision.
                      • Explain why provider selection is contextual rather than an author-facing
                        mode.
                      • Link the current WebForm provider in Add a bundled local WebForm component for schema-backed user input #195 while keeping browser-specific
                        details out of the core contract.

                      Acceptance criteria

                      • <Elicit> expresses a provider-neutral, schema-constrained request.
                      • The provider is selected exclusively through the Context API.
                      • Core validates both the schema and the provider response.
                      • Invalid schemas cause no invocation-content or provider effects.
                      • Missing providers and invalid responses produce actionable diagnostics.
                      • Response options come only from the document's schema.
                      • Interruption remains a lifecycle event.
                      • Replay restores the response without repeating invocation-content or provider work.
                      • Markdown tests configure scripted responses through eval-installed
                        middleware with exact queue consumption.
                      • Specification and website documentation ship in the same PR.

                      Not included

                      • A mode prop or provider selection in Markdown.
                      • RJSF uiSchema or other provider-specific presentation options.
                      • Built-in approve, decline, or cancel actions.
                      • Hidden retry or response repair.
                      • The WebForm implementation and bundled assets tracked in Add a bundled local WebForm component for schema-backed user input #195.
                      • Terminal UI and Effection Inspector providers.

                      Activity

                      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                      Metadata

                      Metadata

                      Assignees

                      No one assigned

                        Labels

                        No labels
                        No labels

                        Projects

                        No projects

                          Milestone

                          No milestone

                          Relationships

                          None yet

                          Development

                          No branches or pull requests

                          Issue actions

                          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
                          Skip to content

                          Add provider-neutral Elicit through the core Context API #197

                          Description

                          @taras

                          Motivation

                          Executable Markdown workflows need a provider-neutral way to pause for
                          structured human input. The document should describe what it is asking and the
                          valid response shape without choosing whether the interaction occurs in a web
                          form, terminal UI, Effection Inspector, automated test, or another host.

                          <Elicit> is a core contextual capability. It does not select an interaction
                          mode. The current CLI configuration uses the WebForm provider tracked in #195.

                          Implementation coordination

                          <Elicit> is an ordinary core TypeScript function component registered as a non-reserved default through #202's registration surface. Core resolves and validates props, owns as, creates the invocation boundary, and applies the validated return binding. The component receives no raw ComponentElement, expression map, binding environment, or as value and is not implemented through Component.expand.

                          Implementation depends on:

                          1. Register function components and migrate legacy component handlers #202 PR 1 for scope-local registration and ordinary function-component resolution; and
                          2. Add a bundled local WebForm component for schema-backed user input #195's reviewed live-form provider operation/adapter contract for the CLI's initial provider.

                          It does not wait for #202's Agent, Testing, assertion, or TestAgent migrations, and it does not depend on WebForm's browser-CI, website, or publication cleanup once the provider contract is available.

                          The component compiles the response schema before calling content(). It then presents the rendered request through the contextual Elicitation provider and returns the provider result through a declared broad JSON return schema. No schema, content, provider, or transport behavior is implemented a second time in an expansion handler.

                          Authoring contract

                          <Elicitschema={responseSchema}as="response">
                          Review the implementation plan and provide your decision.
                          </Elicit>
                          • <Elicit> and the Elicitation Context API live in @executablemd/core.
                          • schema and as are required.
                          • schema accepts captured JSON text or an already structured draft-07 JSON
                            Schema value.
                          • Invocation content expands through content() into the request message presented by the configured provider.
                          • A valid structured response binds directly to as.
                          • The component emits nothing into the surrounding document.
                          • The component exposes no mode, provider, WebForm, or RJSF-specific props.
                          • Authors that intentionally require a browser form or RJSF uiSchema can use
                            the public <WebForm> component from Add a bundled local WebForm component for schema-backed user input #195 directly.

                          Elicitation Context API

                          The contextual provider receives only the rendered request and compiled
                          response schema:

                          interfaceElicitationRequest{message: string;schema: JsonSchema;}

                          It returns an unknown structured value through an Effection operation.

                          Core owns:

                          • schema parsing and compilation;
                          • final response validation;
                          • capture and source diagnostics;
                          • durable response recording and replay; and
                          • interruption through the surrounding Effection scope.

                          The provider owns only its live interaction and transport lifecycle. It does
                          not receive as, workflow run IDs, journal details, or component execution
                          identities.

                          The schema compiles before invocation content expands or the provider is contacted. An
                          invalid schema therefore produces no invocation-content effects and cannot open an
                          interaction.

                          When no provider is installed, <Elicit> fails immediately with a clear
                          no elicitation provider configured diagnostic.

                          Provider configuration

                          Provider selection happens only through the Context API.

                          • The normal CLI composes the WebForm implementation from Add a bundled local WebForm component for schema-backed user input #195 as its current
                            provider.
                          • Applications embedding core explicitly install an elicitation provider.
                          • Automated tests install scripted middleware through the same API.
                          • Future terminal and Effection Inspector integrations replace the provider
                            without changing executable Markdown.

                          Core has no dependency on React, RJSF, HTTP serving, browser launching, terminal
                          UI, or Inspector packages.

                          Response and lifecycle behavior

                          • Core validates every provider result against the compiled schema before it
                            binds or journals the value.
                          • A schema-invalid provider result fails once with normalized validation
                            diagnostics. Core does not silently invoke the provider again.
                          • Interactive correction belongs inside a provider such as WebForm. Workflow
                            retry belongs in visible bounded Markdown control flow.
                          • Provider failures propagate with <Elicit> source context.
                          • Halting the execution halts the provider operation and its owned resources.
                          • <Elicit> has no protocol-defined approve, decline, cancel, or other
                            outcomes. The schema defines every response option available to the user.
                          • Cancellation of execution remains an Effection lifecycle event unless the
                            document explicitly models cancellation as schema data.

                          Durability

                          Only the final validated response is journaled.

                          On replay, core restores the response and binding without expanding the request
                          content or invoking the configured provider. Provider choice and transport
                          details do not affect a completed replay.

                          Testing

                          Add a colocated Elicit.test.md document. It uses an eval block to apply
                          scripted Elicitation Context middleware within each <Test> scope, invokes
                          <Elicit> normally, and asserts the captured response.

                          Core exposes a test helper for constructing the scripted middleware. The eval
                          block supplies an ordered response queue rather than reimplementing a provider.
                          The helper:

                          • consumes one response per live elicitation;
                          • fails when an elicitation has no scripted response;
                          • fails at test teardown when scripted responses remain unused; and
                          • is removed automatically with the enclosing test scope.

                          No testing-only prop or special Markdown component is added. This eval use is
                          an explicitly approved exception for installing Context API middleware.

                          The Markdown tests cover:

                          • schemas supplied as captured JSON and structured values;
                          • invocation content becoming the provider request;
                          • structured capture with no surrounding output;
                          • multiple elicitations consuming scripted responses in order;
                          • missing scripted responses; and
                          • unused scripted responses.

                          Add lower-level automated tests for:

                          • required props and capture name;
                          • malformed and invalid draft-07 schemas;
                          • schema compilation before invocation-content expansion;
                          • no provider being configured;
                          • the provider receiving only the rendered message and compiled schema;
                          • provider results being validated again by core;
                          • normalized diagnostics for invalid provider results;
                          • invocation-content and provider failures propagating with source context;
                          • interruption halting an active provider;
                          • contextual provider override and restoration;
                          • durable response recording;
                          • full replay without invocation-content expansion or provider invocation; and
                          • parity across Deno, Node, and Bun.

                          Documentation

                          • Specify the component props, schema forms, output, validation, and lifecycle
                            behavior in the core component reference.
                          • Document the Elicitation Context API and show how hosts install providers.
                          • Add a website example using <Elicit> for a human review decision.
                          • Explain why provider selection is contextual rather than an author-facing
                            mode.
                          • Link the current WebForm provider in Add a bundled local WebForm component for schema-backed user input #195 while keeping browser-specific
                            details out of the core contract.

                          Acceptance criteria

                          • <Elicit> expresses a provider-neutral, schema-constrained request.
                          • The provider is selected exclusively through the Context API.
                          • Core validates both the schema and the provider response.
                          • Invalid schemas cause no invocation-content or provider effects.
                          • Missing providers and invalid responses produce actionable diagnostics.
                          • Response options come only from the document's schema.
                          • Interruption remains a lifecycle event.
                          • Replay restores the response without repeating invocation-content or provider work.
                          • Markdown tests configure scripted responses through eval-installed
                            middleware with exact queue consumption.
                          • Specification and website documentation ship in the same PR.

                          Not included

                          • A mode prop or provider selection in Markdown.
                          • RJSF uiSchema or other provider-specific presentation options.
                          • Built-in approve, decline, or cancel actions.
                          • Hidden retry or response repair.
                          • The WebForm implementation and bundled assets tracked in Add a bundled local WebForm component for schema-backed user input #195.
                          • Terminal UI and Effection Inspector providers.

                          Activity

                          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                          Metadata

                          Metadata

                          Assignees

                          No one assigned

                            Labels

                            No labels
                            No labels

                            Projects

                            No projects

                              Milestone

                              No milestone

                              Relationships

                              None yet

                              Development

                              No branches or pull requests

                              Issue actions

                              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                              Skip to content

                              Add provider-neutral Elicit through the core Context API #197

                              Description

                              @taras

                              Motivation

                              Executable Markdown workflows need a provider-neutral way to pause for
                              structured human input. The document should describe what it is asking and the
                              valid response shape without choosing whether the interaction occurs in a web
                              form, terminal UI, Effection Inspector, automated test, or another host.

                              <Elicit> is a core contextual capability. It does not select an interaction
                              mode. The current CLI configuration uses the WebForm provider tracked in #195.

                              Implementation coordination

                              <Elicit> is an ordinary core TypeScript function component registered as a non-reserved default through #202's registration surface. Core resolves and validates props, owns as, creates the invocation boundary, and applies the validated return binding. The component receives no raw ComponentElement, expression map, binding environment, or as value and is not implemented through Component.expand.

                              Implementation depends on:

                              1. Register function components and migrate legacy component handlers #202 PR 1 for scope-local registration and ordinary function-component resolution; and
                              2. Add a bundled local WebForm component for schema-backed user input #195's reviewed live-form provider operation/adapter contract for the CLI's initial provider.

                              It does not wait for #202's Agent, Testing, assertion, or TestAgent migrations, and it does not depend on WebForm's browser-CI, website, or publication cleanup once the provider contract is available.

                              The component compiles the response schema before calling content(). It then presents the rendered request through the contextual Elicitation provider and returns the provider result through a declared broad JSON return schema. No schema, content, provider, or transport behavior is implemented a second time in an expansion handler.

                              Authoring contract

                              <Elicitschema={responseSchema}as="response">
                              Review the implementation plan and provide your decision.
                              </Elicit>
                              • <Elicit> and the Elicitation Context API live in @executablemd/core.
                              • schema and as are required.
                              • schema accepts captured JSON text or an already structured draft-07 JSON
                                Schema value.
                              • Invocation content expands through content() into the request message presented by the configured provider.
                              • A valid structured response binds directly to as.
                              • The component emits nothing into the surrounding document.
                              • The component exposes no mode, provider, WebForm, or RJSF-specific props.
                              • Authors that intentionally require a browser form or RJSF uiSchema can use
                                the public <WebForm> component from Add a bundled local WebForm component for schema-backed user input #195 directly.

                              Elicitation Context API

                              The contextual provider receives only the rendered request and compiled
                              response schema:

                              interfaceElicitationRequest{message: string;schema: JsonSchema;}

                              It returns an unknown structured value through an Effection operation.

                              Core owns:

                              • schema parsing and compilation;
                              • final response validation;
                              • capture and source diagnostics;
                              • durable response recording and replay; and
                              • interruption through the surrounding Effection scope.

                              The provider owns only its live interaction and transport lifecycle. It does
                              not receive as, workflow run IDs, journal details, or component execution
                              identities.

                              The schema compiles before invocation content expands or the provider is contacted. An
                              invalid schema therefore produces no invocation-content effects and cannot open an
                              interaction.

                              When no provider is installed, <Elicit> fails immediately with a clear
                              no elicitation provider configured diagnostic.

                              Provider configuration

                              Provider selection happens only through the Context API.

                              • The normal CLI composes the WebForm implementation from Add a bundled local WebForm component for schema-backed user input #195 as its current
                                provider.
                              • Applications embedding core explicitly install an elicitation provider.
                              • Automated tests install scripted middleware through the same API.
                              • Future terminal and Effection Inspector integrations replace the provider
                                without changing executable Markdown.

                              Core has no dependency on React, RJSF, HTTP serving, browser launching, terminal
                              UI, or Inspector packages.

                              Response and lifecycle behavior

                              • Core validates every provider result against the compiled schema before it
                                binds or journals the value.
                              • A schema-invalid provider result fails once with normalized validation
                                diagnostics. Core does not silently invoke the provider again.
                              • Interactive correction belongs inside a provider such as WebForm. Workflow
                                retry belongs in visible bounded Markdown control flow.
                              • Provider failures propagate with <Elicit> source context.
                              • Halting the execution halts the provider operation and its owned resources.
                              • <Elicit> has no protocol-defined approve, decline, cancel, or other
                                outcomes. The schema defines every response option available to the user.
                              • Cancellation of execution remains an Effection lifecycle event unless the
                                document explicitly models cancellation as schema data.

                              Durability

                              Only the final validated response is journaled.

                              On replay, core restores the response and binding without expanding the request
                              content or invoking the configured provider. Provider choice and transport
                              details do not affect a completed replay.

                              Testing

                              Add a colocated Elicit.test.md document. It uses an eval block to apply
                              scripted Elicitation Context middleware within each <Test> scope, invokes
                              <Elicit> normally, and asserts the captured response.

                              Core exposes a test helper for constructing the scripted middleware. The eval
                              block supplies an ordered response queue rather than reimplementing a provider.
                              The helper:

                              • consumes one response per live elicitation;
                              • fails when an elicitation has no scripted response;
                              • fails at test teardown when scripted responses remain unused; and
                              • is removed automatically with the enclosing test scope.

                              No testing-only prop or special Markdown component is added. This eval use is
                              an explicitly approved exception for installing Context API middleware.

                              The Markdown tests cover:

                              • schemas supplied as captured JSON and structured values;
                              • invocation content becoming the provider request;
                              • structured capture with no surrounding output;
                              • multiple elicitations consuming scripted responses in order;
                              • missing scripted responses; and
                              • unused scripted responses.

                              Add lower-level automated tests for:

                              • required props and capture name;
                              • malformed and invalid draft-07 schemas;
                              • schema compilation before invocation-content expansion;
                              • no provider being configured;
                              • the provider receiving only the rendered message and compiled schema;
                              • provider results being validated again by core;
                              • normalized diagnostics for invalid provider results;
                              • invocation-content and provider failures propagating with source context;
                              • interruption halting an active provider;
                              • contextual provider override and restoration;
                              • durable response recording;
                              • full replay without invocation-content expansion or provider invocation; and
                              • parity across Deno, Node, and Bun.

                              Documentation

                              • Specify the component props, schema forms, output, validation, and lifecycle
                                behavior in the core component reference.
                              • Document the Elicitation Context API and show how hosts install providers.
                              • Add a website example using <Elicit> for a human review decision.
                              • Explain why provider selection is contextual rather than an author-facing
                                mode.
                              • Link the current WebForm provider in Add a bundled local WebForm component for schema-backed user input #195 while keeping browser-specific
                                details out of the core contract.

                              Acceptance criteria

                              • <Elicit> expresses a provider-neutral, schema-constrained request.
                              • The provider is selected exclusively through the Context API.
                              • Core validates both the schema and the provider response.
                              • Invalid schemas cause no invocation-content or provider effects.
                              • Missing providers and invalid responses produce actionable diagnostics.
                              • Response options come only from the document's schema.
                              • Interruption remains a lifecycle event.
                              • Replay restores the response without repeating invocation-content or provider work.
                              • Markdown tests configure scripted responses through eval-installed
                                middleware with exact queue consumption.
                              • Specification and website documentation ship in the same PR.

                              Not included

                              • A mode prop or provider selection in Markdown.
                              • RJSF uiSchema or other provider-specific presentation options.
                              • Built-in approve, decline, or cancel actions.
                              • Hidden retry or response repair.
                              • The WebForm implementation and bundled assets tracked in Add a bundled local WebForm component for schema-backed user input #195.
                              • Terminal UI and Effection Inspector providers.

                              Activity

                              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                              Metadata

                              Metadata

                              Assignees

                              No one assigned

                                Labels

                                No labels
                                No labels

                                Projects

                                No projects

                                  Milestone

                                  No milestone

                                  Relationships

                                  None yet

                                  Development

                                  No branches or pull requests

                                  Issue actions