@esheet/renderer 0.0.4-0 → 0.0.4-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,129 @@
1
+ import { default as React } from 'react';
2
+ import { FormResponse, FormStore, UIStore, ValidationError } from '@esheet/core';
3
+ import { FhirQuestionnaireResponse, ResponseExportOptions } from '@esheet/adapters';
4
+ import { RendererTools } from './renderer-tools.js';
5
+ export interface EsheetRendererProps {
6
+ /** Form definition — accepts FormDefinition, SurveyJS schema, MCP elicitation envelope,
7
+ * or any of the above as a JSON/YAML string. Auto-detected and converted internally.
8
+ * Set `strict` to disable auto-conversion and require a valid FormDefinition directly. */
9
+ formDataInput: unknown;
10
+ /** Additional CSS classes for root container */
11
+ className?: string;
12
+ /** Initial form responses (pre-fill data) */
13
+ initialResponses?: FormResponse;
14
+ /** When true, allows `dangerouslyAllowJS: true` in the loaded schema to take effect —
15
+ * enabling field calculations and `conditionType: 'js'` conditions.
16
+ * When `false` (default), dangerous JS never executes regardless of schema content.
17
+ * Only set to `true` when you fully control and trust the form schemas being rendered. */
18
+ allowDangerousJS?: boolean;
19
+ /** When true, disables auto-detection of MCP/SurveyJS formats.
20
+ * Only accepts a valid eSheet FormDefinition (or JSON/YAML string thereof). */
21
+ strict?: boolean;
22
+ /** Called after the form definition has been parsed and loaded into the store. */
23
+ onReady?: () => void;
24
+ /**
25
+ * Called once after the renderer mounts, providing a narrow `RendererTools`
26
+ * facade for MCP / AI tool integrations.
27
+ */
28
+ onRendererToolsReady?: (tools: RendererTools) => void;
29
+ /**
30
+ * When provided, a submit button is rendered at the bottom of the form.
31
+ * Called with the form response after all hard errors pass.
32
+ * If soft-required fields are unanswered, a bypass popup is shown first.
33
+ */
34
+ onSubmit?: (response: FormResponse) => void;
35
+ /** Label for the submit button. Defaults to `'Submit'`. */
36
+ submitLabel?: string;
37
+ /**
38
+ * Enable touch-optimized mode with larger touch targets.
39
+ * - `true`: Always enable touch mode
40
+ * - `false`: Never enable touch mode (CSS media query still applies)
41
+ * - `'auto'`: Enable based on viewport width (<980px) via JavaScript
42
+ * - `undefined`: Rely on CSS media query only (default)
43
+ */
44
+ touchMode?: boolean | 'auto';
45
+ /**
46
+ * Called when touch mode changes (via auto-detection or programmatic toggle).
47
+ * Useful for syncing external UI with the renderer's touch state.
48
+ */
49
+ onTouchModeChange?: (enabled: boolean) => void;
50
+ }
51
+ /** Response format options for getResponse() */
52
+ export type ResponseFormat = 'native' | 'fhir';
53
+ /** Options for getResponse() */
54
+ export interface GetResponseOptions {
55
+ /** Output format: 'native' (default) or 'fhir' (FHIR QuestionnaireResponse) */
56
+ format?: ResponseFormat;
57
+ /** FHIR export options (required when format is 'fhir') */
58
+ fhir?: Omit<ResponseExportOptions, 'questionnaireUrl'> & {
59
+ /** Canonical URL of the questionnaire. Falls back to form._sourceData metadata if available. */
60
+ questionnaireUrl?: string;
61
+ };
62
+ }
63
+ /** Return type for getResponse() — varies by format */
64
+ export type GetResponseResult<T extends ResponseFormat = 'native'> = T extends 'fhir' ? FhirQuestionnaireResponse : FormResponse;
65
+ export interface EsheetRendererHandle {
66
+ /** Get current form responses */
67
+ getRawResponse: () => FormResponse;
68
+ /**
69
+ * Get form responses in the specified format.
70
+ *
71
+ * @param options - Format and export options
72
+ * @returns Native FormResponse or FHIR QuestionnaireResponse
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * // Native format (default)
77
+ * const native = ref.current.getResponse();
78
+ *
79
+ * // FHIR QuestionnaireResponse
80
+ * const fhir = ref.current.getResponse({
81
+ * format: 'fhir',
82
+ * fhir: {
83
+ * questionnaireUrl: 'http://example.org/Questionnaire/my-form',
84
+ * status: 'completed',
85
+ * }
86
+ * });
87
+ * ```
88
+ */
89
+ getResponse: <T extends ResponseFormat = 'native'>(options?: GetResponseOptions & {
90
+ format?: T;
91
+ }) => GetResponseResult<T>;
92
+ /** Get form store instance */
93
+ getFormStore: () => FormStore;
94
+ /** Get UI store instance */
95
+ getUIStore: () => UIStore;
96
+ /** Get validated form responses (returns null if invalid) */
97
+ getValidResponse: () => {
98
+ response: FormResponse | null;
99
+ errors: ValidationError[];
100
+ };
101
+ /** Returns true if touch mode is currently enabled */
102
+ isTouchModeEnabled: () => boolean;
103
+ /** Toggle touch mode on/off. Only works when touchMode prop is 'auto' or undefined. Overrides auto-detection. */
104
+ setTouchMode: (enabled: boolean) => void;
105
+ /** Reset to auto-detection mode (clears manual override). Only works when touchMode='auto'. */
106
+ resetTouchMode: () => void;
107
+ }
108
+ /**
109
+ * EsheetRenderer - Read-only questionnaire form renderer
110
+ *
111
+ * Renders a form in fill-out mode with conditional visibility logic.
112
+ * Reuses all field components from @esheet/fields.
113
+ *
114
+ * @example
115
+ * ```tsx
116
+ * const rendererRef = useRef<EsheetRendererHandle>(null);
117
+ *
118
+ * <EsheetRenderer
119
+ * formData={myFormDefinition}
120
+ * initialResponses={{ field1: 'answer' }}
121
+ * ref={rendererRef}
122
+ * />
123
+ *
124
+ * // Later: get responses
125
+ * const responses = rendererRef.current?.getRawResponse();
126
+ * ```
127
+ */
128
+ export declare const EsheetRenderer: React.ForwardRefExoticComponent<EsheetRendererProps & React.RefAttributes<EsheetRendererHandle>>;
129
+ //# sourceMappingURL=EsheetRenderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EsheetRenderer.d.ts","sourceRoot":"","sources":["../../src/lib/EsheetRenderer.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAC3B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAY9E,MAAM,WAAW,mBAAmB;IAClC;;+FAE2F;IAC3F,aAAa,EAAE,OAAO,CAAC;IACvB,gDAAgD;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6CAA6C;IAC7C,gBAAgB,CAAC,EAAE,YAAY,CAAC;IAChC;;;+FAG2F;IAC3F,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;oFACgF;IAChF,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kFAAkF;IAClF,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;IACtD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,IAAI,CAAC;IAC5C,2DAA2D;IAC3D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;IAC7B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;CAChD;AAMD,gDAAgD;AAChD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE/C,gCAAgC;AAChC,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,2DAA2D;IAC3D,IAAI,CAAC,EAAE,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,CAAC,GAAG;QACvD,gGAAgG;QAChG,gBAAgB,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,uDAAuD;AACvD,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,cAAc,GAAG,QAAQ,IAC/D,CAAC,SAAS,MAAM,GAAG,yBAAyB,GAAG,YAAY,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,cAAc,EAAE,MAAM,YAAY,CAAC;IACnC;;;;;;;;;;;;;;;;;;;;OAoBG;IACH,WAAW,EAAE,CAAC,CAAC,SAAS,cAAc,GAAG,QAAQ,EAC/C,OAAO,CAAC,EAAE,kBAAkB,GAAG;QAAE,MAAM,CAAC,EAAE,CAAC,CAAA;KAAE,KAC1C,iBAAiB,CAAC,CAAC,CAAC,CAAC;IAC1B,8BAA8B;IAC9B,YAAY,EAAE,MAAM,SAAS,CAAC;IAC9B,4BAA4B;IAC5B,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,6DAA6D;IAC7D,gBAAgB,EAAE,MAAM;QACtB,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;QAC9B,MAAM,EAAE,eAAe,EAAE,CAAC;KAC3B,CAAC;IACF,sDAAsD;IACtD,kBAAkB,EAAE,MAAM,OAAO,CAAC;IAClC,iHAAiH;IACjH,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACzC,+FAA+F;IAC/F,cAAc,EAAE,MAAM,IAAI,CAAC;CAC5B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,cAAc,kGA+BzB,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { default as React } from 'react';
2
+ import { FormStore, UIStore } from '@esheet/core';
3
+ export interface FieldNodeProps {
4
+ id: string;
5
+ form: FormStore;
6
+ ui: UIStore;
7
+ /** Nesting depth for visual styling (default: 0) */
8
+ depth?: number;
9
+ }
10
+ /**
11
+ * FieldNode - Renders a single field or section with recursive children
12
+ *
13
+ * Looks up the field component from the registry and passes field props.
14
+ * For sections, recursively renders visible children.
15
+ */
16
+ export declare const FieldNode: React.NamedExoticComponent<FieldNodeProps>;
17
+ //# sourceMappingURL=FieldNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FieldNode.d.ts","sourceRoot":"","sources":["../../../src/lib/components/FieldNode.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,KAAK,EAAuB,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAG5E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;IACZ,oDAAoD;IACpD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,4CAoLpB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { FormStore, UIStore } from '@esheet/core';
2
+ export interface RendererBodyProps {
3
+ form: FormStore;
4
+ ui: UIStore;
5
+ }
6
+ /**
7
+ * RendererBody - Iterates over visible root fields and renders them
8
+ *
9
+ * Respects conditional visibility logic from form store.
10
+ * Only renders fields where isVisible() returns true.
11
+ * Sections recursively render their visible children.
12
+ */
13
+ export declare function RendererBody({ form, ui }: RendererBodyProps): import("react/jsx-runtime").JSX.Element;
14
+ //# sourceMappingURL=RendererBody.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RendererBody.d.ts","sourceRoot":"","sources":["../../../src/lib/components/RendererBody.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,EAAE,OAAO,CAAC;CACb;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,iBAAiB,2CAyD3D"}
@@ -0,0 +1,3 @@
1
+ export { RendererBody } from './RendererBody.js';
2
+ export { FieldNode } from './FieldNode.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { useRendererInit } from './useRendererInit.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { FormResponse, FormStore, UIStore } from '@esheet/core';
2
+ /**
3
+ * Initialize renderer with form definition.
4
+ *
5
+ * Auto-detects and converts the following input formats:
6
+ * - eSheet FormDefinition (object or JSON/YAML string)
7
+ * - FHIR R4 Questionnaire resource
8
+ * - MCP elicitation/create envelope
9
+ * - SurveyJS schema (has top-level `pages` or `elements` array)
10
+ */
11
+ export declare function useRendererInit(form: FormStore, ui: UIStore, formData: unknown, initialResponses?: FormResponse, onValidationError?: (errors: string[]) => void, strict?: boolean, onReady?: () => void, allowDangerousJS?: boolean): void;
12
+ //# sourceMappingURL=useRendererInit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRendererInit.d.ts","sourceRoot":"","sources":["../../../src/lib/hooks/useRendererInit.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,OAAO,EACb,MAAM,cAAc,CAAC;AAYtB;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,EACf,EAAE,EAAE,OAAO,EACX,QAAQ,EAAE,OAAO,EACjB,gBAAgB,CAAC,EAAE,YAAY,EAC/B,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,EAC9C,MAAM,UAAQ,EACd,OAAO,CAAC,EAAE,MAAM,IAAI,EACpB,gBAAgB,UAAQ,GACvB,IAAI,CAyFN"}
@@ -0,0 +1,7 @@
1
+ export { executeToolCall } from './tool-executor.js';
2
+ export { RENDERER_TOOL_DEFINITIONS } from './tool-definitions.js';
3
+ export { RENDERER_SYSTEM_PROMPT } from './system-prompt.js';
4
+ export type { ToolDefinition } from './tool-definitions.js';
5
+ export { useRendererMcpToolHandler } from './useRendererToolBridge.js';
6
+ export type { UseRendererMcpToolHandlerOptions } from './useRendererToolBridge.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,YAAY,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,YAAY,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const RENDERER_SYSTEM_PROMPT: string;
2
+ //# sourceMappingURL=system-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp/system-prompt.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAwByC,CAAC"}
@@ -0,0 +1,10 @@
1
+ export interface ToolDefinition {
2
+ type: string;
3
+ function: {
4
+ name: string;
5
+ description: string;
6
+ parameters: Record<string, unknown>;
7
+ };
8
+ }
9
+ export declare const RENDERER_TOOL_DEFINITIONS: readonly ToolDefinition[];
10
+ //# sourceMappingURL=tool-definitions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-definitions.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp/tool-definitions.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACrC,CAAC;CACH;AAED,eAAO,MAAM,yBAAyB,EAAE,SAAS,cAAc,EAmG9D,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { RendererTools } from '../renderer-tools.js';
2
+ type ToolArgs = Record<string, unknown>;
3
+ export declare function executeToolCall(toolName: string, args: ToolArgs, tools: RendererTools): string | Record<string, unknown>;
4
+ export {};
5
+ //# sourceMappingURL=tool-executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-executor.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp/tool-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAExC,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,aAAa,GACnB,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBlC"}
@@ -0,0 +1,28 @@
1
+ import { RendererTools } from '../renderer-tools.js';
2
+ export interface UseRendererMcpToolHandlerOptions {
3
+ /**
4
+ * The DOM element to listen on for tool-call events.
5
+ * Pass `document` to listen globally, or a specific element to scope it.
6
+ */
7
+ target?: EventTarget;
8
+ /**
9
+ * The event name to listen for, e.g. `'ozwell-tool-call'`.
10
+ */
11
+ eventName: string;
12
+ }
13
+ /**
14
+ * Listens for AI tool-call events on a target element and dispatches them to
15
+ * the renderer's MCP tool executor. Returns the `onRendererToolsReady` callback
16
+ * to pass to `<EsheetRenderer>`.
17
+ *
18
+ * @example – default (listens on document)
19
+ * const onRendererToolsReady = useRendererMcpToolHandler({ eventName: 'ozwell-tool-call' });
20
+ * <EsheetRenderer onRendererToolsReady={onRendererToolsReady} ... />
21
+ *
22
+ * @example – scoped to a container element
23
+ * const ref = React.useRef<HTMLDivElement>(null);
24
+ * const onRendererToolsReady = useRendererMcpToolHandler({ target: ref.current ?? undefined, eventName: 'ozwell-tool-call' });
25
+ * <div ref={ref}><EsheetRenderer onRendererToolsReady={onRendererToolsReady} ... /></div>
26
+ */
27
+ export declare function useRendererMcpToolHandler(options: UseRendererMcpToolHandlerOptions): (tools: RendererTools) => void;
28
+ //# sourceMappingURL=useRendererToolBridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useRendererToolBridge.d.ts","sourceRoot":"","sources":["../../../src/lib/mcp/useRendererToolBridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAG1D,MAAM,WAAW,gCAAgC;IAC/C;;;OAGG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,gCAAgC,GACxC,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAgDhC"}
@@ -0,0 +1,2 @@
1
+ export declare function ensureDefaultFieldComponentsRegistered(): void;
2
+ //# sourceMappingURL=register-defaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register-defaults.d.ts","sourceRoot":"","sources":["../../src/lib/register-defaults.ts"],"names":[],"mappings":"AAkCA,wBAAgB,sCAAsC,IAAI,IAAI,CA8B7D"}
@@ -0,0 +1,56 @@
1
+ import { FormStore, ValidationError } from '@esheet/core';
2
+ import { RenderFieldNode } from './renderer.js';
3
+ /** Summary of a single field, suitable for AI context. */
4
+ export interface RendererFieldSummary {
5
+ id: string;
6
+ fieldType: string;
7
+ /** For text fields: the HTML input type (e.g. 'date', 'datetime-local', 'month', 'time', 'email', 'number'). Use the correct format when filling this field. */
8
+ inputType?: string;
9
+ /** Required value format for structured input types. Use this exact format when calling fill_field. */
10
+ valueFormat?: string;
11
+ question: string | undefined;
12
+ required: boolean;
13
+ /** True if this field already has a response value. False means it is still empty and needs to be filled. */
14
+ hasValue: boolean;
15
+ /** Available option values for selection fields (radio, check, dropdown, etc.). Only present when the field has options. */
16
+ options?: string[];
17
+ /** Available row labels for matrix fields. Only present for singlematrix / multimatrix. */
18
+ rows?: string[];
19
+ /** Available column labels for matrix fields. Only present for singlematrix / multimatrix. */
20
+ columns?: string[];
21
+ }
22
+ /**
23
+ * Narrow interface exposed to MCP / AI tools via `onRendererToolsReady`.
24
+ * Read-oriented: inspect responses, fill responses, and query the render tree.
25
+ */
26
+ export interface RendererTools {
27
+ /** Currently visible, fillable fields with their available options. */
28
+ getForm: () => {
29
+ formId: string;
30
+ fieldCount: number;
31
+ fields: RendererFieldSummary[];
32
+ };
33
+ /** All fields in the form regardless of visibility, rules, or enabled state. */
34
+ getFormRaw: () => {
35
+ formId: string;
36
+ fieldCount: number;
37
+ fields: RendererFieldSummary[];
38
+ };
39
+ /** Get current raw responses keyed by field ID. */
40
+ getResponses: () => Record<string, unknown>;
41
+ /** Get validated responses — returns null if validation fails. */
42
+ getValidResponse: () => {
43
+ response: Record<string, unknown> | null;
44
+ errors: ValidationError[];
45
+ };
46
+ /** Set a response value for one visible field. Returns true on success, false if field not found/visible, or an error string if the value format is invalid. */
47
+ fillField: (fieldId: string, value: unknown) => boolean | string;
48
+ /** Clear all responses. */
49
+ clearResponses: () => void;
50
+ /** Full render tree with visibility/enabled/required per field. */
51
+ getFormTree: () => RenderFieldNode[];
52
+ /** Find a field ID by exact ID or partial question match. */
53
+ resolveFieldId: (fieldId?: string, fieldQuestion?: string) => string | undefined;
54
+ }
55
+ export declare function createRendererTools(formStore: FormStore): RendererTools;
56
+ //# sourceMappingURL=renderer-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-tools.d.ts","sourceRoot":"","sources":["../../src/lib/renderer-tools.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,SAAS,EACd,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,0DAA0D;AAC1D,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,gKAAgK;IAChK,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uGAAuG;IACvG,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,6GAA6G;IAC7G,QAAQ,EAAE,OAAO,CAAC;IAClB,4HAA4H;IAC5H,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,2FAA2F;IAC3F,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,OAAO,EAAE,MAAM;QACb,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,oBAAoB,EAAE,CAAC;KAChC,CAAC;IACF,gFAAgF;IAChF,UAAU,EAAE,MAAM;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,oBAAoB,EAAE,CAAC;KAChC,CAAC;IACF,mDAAmD;IACnD,YAAY,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,kEAAkE;IAClE,gBAAgB,EAAE,MAAM;QACtB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;QACzC,MAAM,EAAE,eAAe,EAAE,CAAC;KAC3B,CAAC;IACF,gKAAgK;IAChK,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM,CAAC;IACjE,2BAA2B;IAC3B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,mEAAmE;IACnE,WAAW,EAAE,MAAM,eAAe,EAAE,CAAC;IACrC,6DAA6D;IAC7D,cAAc,EAAE,CACd,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,CAAC,EAAE,MAAM,KACnB,MAAM,GAAG,SAAS,CAAC;CACzB;AAkBD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,aAAa,CA4XvE"}
@@ -0,0 +1,49 @@
1
+ import { FieldDefinition, FormDefinition, FormResponse } from '@esheet/core';
2
+ export interface RenderTreeOptions {
3
+ /** Include fields that resolve to invisible (default: false). */
4
+ includeHidden?: boolean;
5
+ /**
6
+ * Opt-in to allow dangerous JS execution. When `false` (default), any
7
+ * `dangerouslyAllowJS: true` in the schema is ignored — JS conditions always
8
+ * return `false`. Only set to `true` when you trust the schema content.
9
+ */
10
+ allowDangerousJS?: boolean;
11
+ }
12
+ export interface RenderFieldNode {
13
+ /** Field identifier. */
14
+ id: string;
15
+ /** Field definition without nested children. */
16
+ definition: Omit<FieldDefinition, 'fields'>;
17
+ /** Computed visible state. */
18
+ visible: boolean;
19
+ /** Computed enabled state. */
20
+ enabled: boolean;
21
+ /** Computed required state. */
22
+ required: boolean;
23
+ /** Computed value from setValue effects (if any). */
24
+ computedValue?: string | number | null;
25
+ /** Renderable child nodes (sections only). */
26
+ children: RenderFieldNode[];
27
+ }
28
+ /**
29
+ * Build a render tree from form definition + responses.
30
+ *
31
+ * Sections are represented as nodes with nested `children`.
32
+ * Computed values from setValue effects are included in computedValue field.
33
+ */
34
+ export declare function renderer(definition: FormDefinition, responses?: FormResponse, options?: RenderTreeOptions): RenderFieldNode[];
35
+ /** Alias for readability in consumers that prefer explicit naming. */
36
+ export declare const buildRenderTree: typeof renderer;
37
+ /**
38
+ * Apply computed values from a render tree to a responses object.
39
+ *
40
+ * Iterates through the render tree and merges any computed values
41
+ * (from setValue effects) into the responses map. Wraps string/number
42
+ * values as FieldResponse answer objects.
43
+ *
44
+ * @param tree - Render tree with computed values.
45
+ * @param responses - Base responses object to merge into (is modified in-place).
46
+ * @returns Updated responses object.
47
+ */
48
+ export declare function applyComputedValues(tree: RenderFieldNode[], responses?: FormResponse): FormResponse;
49
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/lib/renderer.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,KAAK,YAAY,EAElB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,wBAAwB;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,gDAAgD;IAChD,UAAU,EAAE,IAAI,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAC;IAC5C,8BAA8B;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,8BAA8B;IAC9B,OAAO,EAAE,OAAO,CAAC;IACjB,+BAA+B;IAC/B,QAAQ,EAAE,OAAO,CAAC;IAClB,qDAAqD;IACrD,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACvC,8CAA8C;IAC9C,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,UAAU,EAAE,cAAc,EAC1B,SAAS,GAAE,YAAiB,EAC5B,OAAO,GAAE,iBAAsB,GAC9B,eAAe,EAAE,CAyDnB;AAED,sEAAsE;AACtE,eAAO,MAAM,eAAe,iBAAW,CAAC;AAExC;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,eAAe,EAAE,EACvB,SAAS,GAAE,YAAiB,GAC3B,YAAY,CAgBd"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esheet/renderer",
3
- "version": "0.0.4-0",
3
+ "version": "0.0.4-2",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/mieweb/eSheet"
@@ -38,9 +38,9 @@
38
38
  ]
39
39
  },
40
40
  "dependencies": {
41
- "@esheet/adapters": "0.0.3",
42
- "@esheet/core": "0.0.3",
43
- "@esheet/fields": "0.0.3",
41
+ "@esheet/adapters": "0.0.4-2",
42
+ "@esheet/core": "0.0.4-2",
43
+ "@esheet/fields": "0.0.4-2",
44
44
  "js-yaml": "^4.1.0"
45
45
  },
46
46
  "peerDependencies": {