markform 0.1.22 → 0.1.24
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.
- package/README.md +53 -16
- package/dist/ai-sdk.d.mts +1 -1
- package/dist/ai-sdk.mjs +48 -6
- package/dist/ai-sdk.mjs.map +1 -1
- package/dist/bin.mjs +1 -1
- package/dist/{cli-C8F9yDsv.mjs → cli-B1DhFYBS.mjs} +642 -96
- package/dist/cli-B1DhFYBS.mjs.map +1 -0
- package/dist/cli.d.mts +1 -1
- package/dist/cli.mjs +1 -1
- package/dist/{coreTypes-CTLr-NGd.mjs → coreTypes-CctFK6uE.mjs} +38 -2
- package/dist/coreTypes-CctFK6uE.mjs.map +1 -0
- package/dist/{coreTypes-BlsJkU1w.d.mts → coreTypes-GxzWNXap.d.mts} +137 -3
- package/dist/{fillRecord-DTl5lnK0.d.mts → fillRecord-DeqI2pQ5.d.mts} +25 -1
- package/dist/{fillRecordRenderer-CruJrLkj.mjs → fillRecordRenderer-VBQ2vwPV.mjs} +2 -5
- package/dist/fillRecordRenderer-VBQ2vwPV.mjs.map +1 -0
- package/dist/index.d.mts +52 -29
- package/dist/index.mjs +5 -5
- package/dist/{apply-C7mO7VkZ.mjs → prompts-BCnYaH4_.mjs} +969 -8
- package/dist/prompts-BCnYaH4_.mjs.map +1 -0
- package/dist/render.d.mts +2 -2
- package/dist/render.mjs +1 -1
- package/dist/{session-BCcltrLA.mjs → session-BLjN3BkJ.mjs} +2 -2
- package/dist/{session-BCcltrLA.mjs.map → session-BLjN3BkJ.mjs.map} +1 -1
- package/dist/{session-VeSkVrck.mjs → session-D7C7IlEv.mjs} +1 -1
- package/dist/{shared-CsdT2T7k.mjs → shared-CuSRYcIB.mjs} +3 -3
- package/dist/shared-CuSRYcIB.mjs.map +1 -0
- package/dist/{shared-fb0nkzQi.mjs → shared-DtorFV21.mjs} +1 -1
- package/dist/{src-CbRnGzMK.mjs → src-C5OWf1dL.mjs} +114 -826
- package/dist/src-C5OWf1dL.mjs.map +1 -0
- package/docs/markform-apis.md +6 -0
- package/docs/markform-reference.md +26 -1
- package/docs/markform-spec.md +11 -3
- package/docs/skill/SKILL.md +119 -0
- package/examples/rejection-test/rejection-test.session.yaml +52 -0
- package/examples/simple/simple-with-skips.session.yaml +78 -0
- package/examples/simple/simple.session.yaml +78 -0
- package/package.json +2 -2
- package/dist/apply-C7mO7VkZ.mjs.map +0 -1
- package/dist/cli-C8F9yDsv.mjs.map +0 -1
- package/dist/coreTypes-CTLr-NGd.mjs.map +0 -1
- package/dist/fillRecordRenderer-CruJrLkj.mjs.map +0 -1
- package/dist/shared-CsdT2T7k.mjs.map +0 -1
- package/dist/src-CbRnGzMK.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
# Markform
|
|
2
2
|
|
|
3
|
-
[](https://github.com/jlevy/markform/actions/runs/
|
|
4
|
-
[](https://github.com/jlevy/markform/actions/runs/
|
|
3
|
+
[](https://github.com/jlevy/markform/actions/runs/22024451235)
|
|
4
|
+
[](https://github.com/jlevy/markform/actions/runs/22024451235)
|
|
5
5
|
[](https://www.npmjs.com/package/markform)
|
|
6
6
|
[](https://x.com/ojoshe)
|
|
7
7
|
|
|
8
|
+
### What if your Markdown docs had an agent-friendly semantic API?
|
|
9
|
+
|
|
8
10
|
**Markform** is a text format for defining structured forms that humans can read,
|
|
9
11
|
machines can parse, and agents can fill via tool calls.
|
|
10
12
|
|
|
@@ -13,12 +15,14 @@ Agents fill forms incrementally via patches.
|
|
|
13
15
|
Fields are validated, so errors are caught early and can be corrected.
|
|
14
16
|
Humans can review or intervene at any point.
|
|
15
17
|
|
|
16
|
-
|
|
18
|
+
### Why forms?
|
|
19
|
+
|
|
20
|
+
For deep research or complex AI tasks, you need more than just prompts or
|
|
17
21
|
flow: you need *structure*, which is precise control over agent output at every stage of
|
|
18
22
|
a workflow. A well-designed form combines instructions, structured data, and validations
|
|
19
23
|
in one place.
|
|
20
24
|
|
|
21
|
-
|
|
25
|
+
### How it Works
|
|
22
26
|
|
|
23
27
|
- A Markform document exposes a programmatic interface: users fill fields via CLI or web
|
|
24
28
|
UI, agents fill via tool calls ([Vercel AI SDK](https://github.com/vercel/ai)
|
|
@@ -33,9 +37,25 @@ in one place.
|
|
|
33
37
|
[precise specification](https://github.com/jlevy/markform/blob/main/docs/markform-spec.md).
|
|
34
38
|
Export Markform syntax to JSON, YAML, JSON Schema, or plain Markdown reports.
|
|
35
39
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
- Optionally, the whole thing is wrapped in a harness where large forms can be filled
|
|
41
|
+
concurrently by any LLM in a structured agentic loop.
|
|
42
|
+
|
|
43
|
+
### Useful details
|
|
44
|
+
|
|
45
|
+
- Markform syntax is a good source format: it is **token-efficient text** you can read, diff, and
|
|
46
|
+
version control and it is **ideal for context engineering** because it combines
|
|
47
|
+
document context, data schema, and memory (data filled so far).
|
|
48
|
+
|
|
49
|
+
- Structure is defined with HTML comment tags (`<!-- field -->`) that
|
|
50
|
+
render invisibly on GitHub, so **forms look like regular Markdown**. (Jinja-style
|
|
51
|
+
tag syntax also works if you prefer.)
|
|
52
|
+
|
|
53
|
+
- Optionally, **a fill record** of the form-filling process is kept, so you can see
|
|
54
|
+
and debug exactly how forms are filled by agents, tool usage, LLM call time, etc.
|
|
55
|
+
|
|
56
|
+
- The CLI has a built-in web renderer, **`markform serve`**, for easy viewing and debugging
|
|
57
|
+
of forms (including a form web UI, the form schema, and a waterfall-style overview of the
|
|
58
|
+
fill record, including performance details, which is useful for large, concurrently filled forms).
|
|
39
59
|
|
|
40
60
|
## Simple Example: Research a Movie
|
|
41
61
|
|
|
@@ -310,6 +330,23 @@ npm install -g markform
|
|
|
310
330
|
npm install markform
|
|
311
331
|
```
|
|
312
332
|
|
|
333
|
+
### Use as a Claude Code Skill
|
|
334
|
+
|
|
335
|
+
If you install markform globally (`npm install -g markform`), you can tell Claude to run
|
|
336
|
+
`markform setup --auto` to install it as a Claude Code skill. This teaches Claude how to
|
|
337
|
+
use markform commands when working with `.form.md` files in your project.
|
|
338
|
+
|
|
339
|
+
```bash
|
|
340
|
+
# Install as a Claude Code skill (non-interactive, for agents)
|
|
341
|
+
markform setup --auto
|
|
342
|
+
|
|
343
|
+
# Or guided setup with prompts (for humans)
|
|
344
|
+
markform setup --interactive
|
|
345
|
+
|
|
346
|
+
# View the skill content
|
|
347
|
+
markform skill
|
|
348
|
+
```
|
|
349
|
+
|
|
313
350
|
### More Example Forms
|
|
314
351
|
|
|
315
352
|
The package includes example forms.
|
|
@@ -364,16 +401,16 @@ flowchart LR
|
|
|
364
401
|
subgraph SPEC["<b>MARKFORM SPEC</b>"]
|
|
365
402
|
direction TB
|
|
366
403
|
|
|
367
|
-
subgraph L1["<b>LAYER 1: SYNTAX</b><br/>Markdoc tag syntax
|
|
404
|
+
subgraph L1["<b>LAYER 1: SYNTAX</b><br/>Markdoc tag syntax<br/>and frontmatter (form,<br/>group, string-field, <br/>checkboxes, etc.)"]
|
|
368
405
|
end
|
|
369
406
|
|
|
370
|
-
subgraph L2["<b>LAYER 2: FORM DATA MODEL</b><br/>Schema definitions
|
|
407
|
+
subgraph L2["<b>LAYER 2: FORM DATA MODEL</b><br/>Schema definitions<br/>for forms, fields, values"]
|
|
371
408
|
end
|
|
372
409
|
|
|
373
|
-
subgraph L3["<b>LAYER 3: VALIDATION
|
|
410
|
+
subgraph L3["<b>LAYER 3: VALIDATION <br/>AND PATCHES</b><br/>Rules for filling forms<br/>via patches, required<br/>field semantics, validation"]
|
|
374
411
|
end
|
|
375
412
|
|
|
376
|
-
subgraph L4["<b>LAYER 4: TOOL API
|
|
413
|
+
subgraph L4["<b>LAYER 4: TOOL API <br/>AND INTERFACES</b><br/>Abstract form-filling<br/>loop, concurrency<br/>model, tool layer"]
|
|
377
414
|
end
|
|
378
415
|
|
|
379
416
|
L4 --> L3 --> L2 --> L1
|
|
@@ -382,19 +419,19 @@ flowchart LR
|
|
|
382
419
|
subgraph IMPL["<b>THIS IMPLEMENTATION</b>"]
|
|
383
420
|
direction TB
|
|
384
421
|
|
|
385
|
-
subgraph CLI["<b>`markform` CLI</b><br/>Command-line interface
|
|
422
|
+
subgraph CLI["<b>`markform` CLI</b><br/>Command-line interface<br/>to all features"]
|
|
386
423
|
end
|
|
387
424
|
|
|
388
|
-
subgraph AGENT["<b>AGENT TOOL INTERFACE</b><br/>Tool API library
|
|
425
|
+
subgraph AGENT["<b>AGENT TOOL INTERFACE</b><br/>Tool API library><br/>(AI SDK tools)"]
|
|
389
426
|
end
|
|
390
427
|
|
|
391
|
-
subgraph HARNESS["<b>EXECUTION HARNESS</b><br/>
|
|
428
|
+
subgraph HARNESS["<b>EXECUTION HARNESS</b><br/>Concurrent form-filling<br/>agentic loop<br/>(AI SDK)"]
|
|
392
429
|
end
|
|
393
430
|
|
|
394
|
-
subgraph ENGINE["<b>CORE TYPESCRIPT APIS</b><br/>Markdoc parser, serializer
|
|
431
|
+
subgraph ENGINE["<b>CORE TYPESCRIPT APIS</b><br/>Markdoc parser, serializer,<br/>patch application,<br/>validation (jiti for rules)"]
|
|
395
432
|
end
|
|
396
433
|
|
|
397
|
-
subgraph TEST["<b>TESTING FRAMEWORK</b><br/>Golden session testing
|
|
434
|
+
subgraph TEST["<b>TESTING FRAMEWORK</b><br/>Golden session testing<br/>(.session.yaml transcripts)"]
|
|
398
435
|
end
|
|
399
436
|
|
|
400
437
|
CLI --> ENGINE
|
package/dist/ai-sdk.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
import { At as ParsedForm, Nt as PatchSchema, U as FieldResponse, Y as FormSchema, at as InspectResult, et as Id,
|
|
2
|
+
import { At as ParsedForm, Nt as PatchSchema, U as FieldResponse, Y as FormSchema, at as InspectResult, et as Id, gr as ValidatorRegistry, jt as Patch, r as ApplyResult } from "./coreTypes-GxzWNXap.mjs";
|
|
3
3
|
import { z } from "zod";
|
|
4
4
|
|
|
5
5
|
//#region src/integrations/toolTypes.d.ts
|
package/dist/ai-sdk.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
|
|
2
|
-
import { R as PatchSchema } from "./coreTypes-
|
|
3
|
-
import {
|
|
2
|
+
import { R as PatchSchema } from "./coreTypes-CctFK6uE.mjs";
|
|
3
|
+
import { _ as inspect, m as applyPatches, p as findFieldById, s as getPatchFormatHint, u as getFieldIdFromRef, w as serializeForm } from "./prompts-BCnYaH4_.mjs";
|
|
4
4
|
import { z } from "zod";
|
|
5
5
|
|
|
6
6
|
//#region src/integrations/vercelAiSdkTools.ts
|
|
@@ -64,7 +64,7 @@ const InspectInputSchema = z.object({}).describe("No input parameters required.
|
|
|
64
64
|
/**
|
|
65
65
|
* Input schema for markform_apply tool.
|
|
66
66
|
*/
|
|
67
|
-
const ApplyInputSchema = z.object({ patches: z.array(PatchSchema).min(1).max(20).describe("Array of patches to apply to the form. Each patch sets or clears a field value.
|
|
67
|
+
const ApplyInputSchema = z.object({ patches: z.array(PatchSchema).min(1).max(20).describe("Array of patches to apply to the form. Each patch sets or clears a field value. Set operations: set_string, set_number, set_string_list, set_single_select, set_multi_select, set_checkboxes, set_url, set_url_list, set_date, set_year, set_table. Incremental operations: append_table, delete_table, append_string_list, delete_string_list, append_url_list, delete_url_list. Meta operations: clear_field, skip_field, abort_field. Example: [{ \"op\": \"set_string\", \"fieldId\": \"name\", \"value\": \"Alice\" }]") }).describe("Apply patches to update form field values.");
|
|
68
68
|
/**
|
|
69
69
|
* Input schema for markform_export tool (no parameters).
|
|
70
70
|
*/
|
|
@@ -73,6 +73,43 @@ const ExportInputSchema = z.object({}).describe("No input parameters required. C
|
|
|
73
73
|
* Input schema for markform_get_markdown tool (no parameters).
|
|
74
74
|
*/
|
|
75
75
|
const GetMarkdownInputSchema = z.object({}).describe("No input parameters required. Call this tool to get the canonical Markdown representation of the current form.");
|
|
76
|
+
function buildFieldMeta(field) {
|
|
77
|
+
const meta = {
|
|
78
|
+
kind: field.kind,
|
|
79
|
+
label: field.label,
|
|
80
|
+
required: field.required
|
|
81
|
+
};
|
|
82
|
+
if (field.kind === "single_select" || field.kind === "multi_select") meta.options = field.options.map((o) => o.id);
|
|
83
|
+
else if (field.kind === "checkboxes") {
|
|
84
|
+
meta.options = field.options.map((o) => o.id);
|
|
85
|
+
meta.checkbox_mode = field.checkboxMode;
|
|
86
|
+
} else if (field.kind === "table") meta.columns = field.columns.map((c) => ({
|
|
87
|
+
id: c.id,
|
|
88
|
+
type: c.type,
|
|
89
|
+
required: c.required
|
|
90
|
+
}));
|
|
91
|
+
return meta;
|
|
92
|
+
}
|
|
93
|
+
function generatePatchExample(field) {
|
|
94
|
+
const opts = { fieldId: field.id };
|
|
95
|
+
if (field.kind === "table") opts.columnIds = field.columns.map((c) => c.id);
|
|
96
|
+
else if (field.kind === "checkboxes") {
|
|
97
|
+
opts.checkboxMode = field.checkboxMode;
|
|
98
|
+
opts.optionIds = field.options.map((o) => o.id);
|
|
99
|
+
}
|
|
100
|
+
return getPatchFormatHint(field.kind, opts);
|
|
101
|
+
}
|
|
102
|
+
function enrichIssue(issue, form) {
|
|
103
|
+
const fieldId = getFieldIdFromRef(issue.ref, issue.scope);
|
|
104
|
+
const field = fieldId ? findFieldById(form, fieldId) : void 0;
|
|
105
|
+
if (!field) return issue;
|
|
106
|
+
return {
|
|
107
|
+
...issue,
|
|
108
|
+
field: buildFieldMeta(field),
|
|
109
|
+
set_example: generatePatchExample(field),
|
|
110
|
+
skip_example: field.required ? null : `{ op: "skip_field", fieldId: "${field.id}", reason: "Not applicable" }`
|
|
111
|
+
};
|
|
112
|
+
}
|
|
76
113
|
/**
|
|
77
114
|
* Create Markform AI SDK tools for agent-driven form filling.
|
|
78
115
|
*
|
|
@@ -105,18 +142,23 @@ function createMarkformTools(options) {
|
|
|
105
142
|
description: "Inspect the current form state. Returns structure summary, progress summary, validation issues, and completion status. Use this to understand what fields need to be filled and what issues exist. Issues are sorted by priority (1 = highest). Focus on 'required' severity issues first.",
|
|
106
143
|
inputSchema: InspectInputSchema,
|
|
107
144
|
execute: () => {
|
|
108
|
-
const
|
|
145
|
+
const form = sessionStore.getForm();
|
|
146
|
+
const result = inspect(form);
|
|
147
|
+
const enrichedIssues = result.issues.map((issue) => enrichIssue(issue, form));
|
|
109
148
|
const requiredCount = result.issues.filter((i) => i.severity === "required").length;
|
|
110
149
|
const message = result.isComplete ? "Form is complete. All required fields are filled." : `Form has ${requiredCount} required issue(s) to resolve.`;
|
|
111
150
|
return Promise.resolve({
|
|
112
151
|
success: true,
|
|
113
|
-
data:
|
|
152
|
+
data: {
|
|
153
|
+
...result,
|
|
154
|
+
issues: enrichedIssues
|
|
155
|
+
},
|
|
114
156
|
message
|
|
115
157
|
});
|
|
116
158
|
}
|
|
117
159
|
},
|
|
118
160
|
markform_apply: {
|
|
119
|
-
description: "Apply patches to update form field values. Valid patches are applied even if some fail. Single values are automatically coerced to arrays for list fields. Returns applied patches, warnings for coerced values, and rejected patches separately.
|
|
161
|
+
description: "Apply patches to update form field values. Valid patches are applied even if some fail. Single values are automatically coerced to arrays for list fields. Returns applied patches, warnings for coerced values, and rejected patches separately. Set operations: set_string, set_number, set_string_list, set_single_select, set_multi_select, set_checkboxes, set_url, set_url_list, set_date, set_year, set_table. Incremental: append_table, delete_table, append_string_list, delete_string_list, append_url_list, delete_url_list. Meta: clear_field, skip_field, abort_field.",
|
|
120
162
|
inputSchema: ApplyInputSchema,
|
|
121
163
|
execute: ({ patches }) => {
|
|
122
164
|
const form = sessionStore.getForm();
|
package/dist/ai-sdk.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-sdk.mjs","names":[],"sources":["../src/integrations/vercelAiSdkTools.ts"],"sourcesContent":["/**\n * AI SDK Integration for Markform.\n *\n * Provides Vercel AI SDK compatible tools for agent-driven form filling.\n * Use createMarkformTools() to create a toolset that wraps the Markform engine.\n *\n * @example\n * ```typescript\n * import { createMarkformTools, MarkformSessionStore } from 'markform/ai-sdk';\n * import { generateText } from 'ai';\n *\n * const store = new MarkformSessionStore(parsedForm);\n * const tools = createMarkformTools({ sessionStore: store });\n *\n * const { text } = await generateText({\n * model: openai('gpt-4'),\n * prompt: 'Fill out this form...',\n * tools,\n * });\n * ```\n */\n\nimport { z } from 'zod';\nimport type { ParsedForm, Patch, ValidatorRegistry } from '../engine/coreTypes.js';\nimport { inspect } from '../engine/inspect.js';\nimport { applyPatches } from '../engine/apply.js';\nimport { serializeForm } from '../engine/serialize.js';\nimport { PatchSchema } from '../engine/coreTypes.js';\n\n// =============================================================================\n// Session Store\n// =============================================================================\n\n/**\n * Session store for managing form state during AI interactions.\n *\n * The AI SDK tools operate on a shared form instance through this store.\n * Create one store per form-filling session.\n */\nexport class MarkformSessionStore {\n private form: ParsedForm;\n private validatorRegistry: ValidatorRegistry;\n\n constructor(form: ParsedForm, validatorRegistry?: ValidatorRegistry) {\n this.form = form;\n this.validatorRegistry = validatorRegistry ?? {};\n }\n\n /**\n * Get the current form.\n */\n getForm(): ParsedForm {\n return this.form;\n }\n\n /**\n * Get the validator registry.\n */\n getValidatorRegistry(): ValidatorRegistry {\n return this.validatorRegistry;\n }\n\n /**\n * Update the form values.\n */\n updateForm(form: ParsedForm): void {\n this.form = form;\n }\n}\n\n// =============================================================================\n// Tool Creation Options\n// =============================================================================\n\n/**\n * Options for creating Markform AI SDK tools.\n */\nexport interface CreateMarkformToolsOptions {\n /**\n * Session store managing the form state.\n */\n sessionStore: MarkformSessionStore;\n\n /**\n * Whether to include the markform_get_markdown tool.\n * Defaults to true.\n */\n includeGetMarkdown?: boolean;\n}\n\n// =============================================================================\n// Tool Types (imported from toolTypes.ts)\n// =============================================================================\n\nimport type {\n ApplyToolResult,\n ExportToolResult,\n GetMarkdownToolResult,\n InspectToolResult,\n MarkformTool,\n MarkformToolSet,\n} from './toolTypes.js';\n\n// Re-export types for backwards compatibility\nexport type {\n ApplyToolResult,\n ExportToolResult,\n GetMarkdownToolResult,\n InspectToolResult,\n MarkformTool,\n MarkformToolSet,\n} from './toolTypes.js';\n\n// =============================================================================\n// Zod Schemas for Tool Inputs\n// =============================================================================\n\n/**\n * Input schema for markform_inspect tool (no parameters).\n */\nconst InspectInputSchema = z\n .object({})\n .describe('No input parameters required. Call this tool to inspect the current form state.');\n\n/**\n * Input schema for markform_apply tool.\n */\nconst ApplyInputSchema = z\n .object({\n patches: z\n .array(PatchSchema)\n .min(1)\n .max(20)\n .describe(\n 'Array of patches to apply to the form. Each patch sets or clears a field value. ' +\n 'Operations: set_string, set_number, set_string_list, set_single_select, set_multi_select, ' +\n 'set_checkboxes, set_url, set_url_list, set_date, set_year, set_table, clear_field, skip_field, abort_field. ' +\n 'Example: [{ \"op\": \"set_string\", \"fieldId\": \"name\", \"value\": \"Alice\" }]',\n ),\n })\n .describe('Apply patches to update form field values.');\n\n/**\n * Input schema for markform_export tool (no parameters).\n */\nconst ExportInputSchema = z\n .object({})\n .describe(\n 'No input parameters required. Call this tool to export the form schema and current values as JSON.',\n );\n\n/**\n * Input schema for markform_get_markdown tool (no parameters).\n */\nconst GetMarkdownInputSchema = z\n .object({})\n .describe(\n 'No input parameters required. Call this tool to get the canonical Markdown representation of the current form.',\n );\n\n// =============================================================================\n// Tool Factory\n// =============================================================================\n\n/**\n * Create Markform AI SDK tools for agent-driven form filling.\n *\n * Returns a toolset compatible with Vercel AI SDK's generateText and streamText.\n *\n * @param options - Tool creation options including session store\n * @returns MarkformToolSet containing all tools\n *\n * @example\n * ```typescript\n * import { parseForm } from 'markform';\n * import { createMarkformTools, MarkformSessionStore } from 'markform/ai-sdk';\n *\n * const form = parseForm(markdownContent);\n * const store = new MarkformSessionStore(form);\n * const tools = createMarkformTools({ sessionStore: store });\n *\n * // Use with AI SDK\n * const result = await generateText({\n * model: yourModel,\n * tools,\n * prompt: 'Fill out this form based on the user information...',\n * });\n * ```\n */\nexport function createMarkformTools(options: CreateMarkformToolsOptions): MarkformToolSet {\n const { sessionStore, includeGetMarkdown = true } = options;\n\n // markform_inspect - Get current form state with issues\n const markform_inspect: MarkformTool<Record<string, never>, InspectToolResult> = {\n description:\n 'Inspect the current form state. Returns structure summary, progress summary, validation issues, ' +\n 'and completion status. Use this to understand what fields need to be filled and what issues exist. ' +\n \"Issues are sorted by priority (1 = highest). Focus on 'required' severity issues first.\",\n inputSchema: InspectInputSchema,\n execute: () => {\n const form = sessionStore.getForm();\n const result = inspect(form);\n\n const requiredCount = result.issues.filter((i) => i.severity === 'required').length;\n const message = result.isComplete\n ? 'Form is complete. All required fields are filled.'\n : `Form has ${requiredCount} required issue(s) to resolve.`;\n\n return Promise.resolve({\n success: true,\n data: result,\n message,\n });\n },\n };\n\n // markform_apply - Apply patches to update form values\n const markform_apply: MarkformTool<{ patches: Patch[] }, ApplyToolResult> = {\n description:\n 'Apply patches to update form field values. Valid patches are applied even if some fail. ' +\n 'Single values are automatically coerced to arrays for list fields. ' +\n 'Returns applied patches, warnings for coerced values, and rejected patches separately. ' +\n 'Patch operations: set_string, set_number, set_string_list, set_single_select, set_multi_select, ' +\n 'set_checkboxes, set_url, set_url_list, set_date, set_year, set_table, clear_field, skip_field, abort_field.',\n inputSchema: ApplyInputSchema,\n execute: ({ patches }) => {\n const form = sessionStore.getForm();\n const result = applyPatches(form, patches);\n\n // Update the store with the modified form\n sessionStore.updateForm(form);\n\n const warningNote = result.warnings.length > 0 ? ` (${result.warnings.length} coerced)` : '';\n const remaining = result.issues.filter((i) => i.severity === 'required').length;\n\n const message =\n result.applyStatus === 'applied'\n ? `Applied ${patches.length} patch(es)${warningNote}. ${\n result.isComplete\n ? 'Form is now complete!'\n : `${remaining} required issue(s) remaining.`\n }`\n : result.applyStatus === 'partial'\n ? `Applied ${result.appliedPatches.length}/${patches.length} patches${warningNote}. ` +\n `${result.rejectedPatches.length} rejected.`\n : `All patches rejected. Check field IDs and value types.`;\n\n return Promise.resolve({\n success: result.applyStatus !== 'rejected',\n data: result,\n message,\n });\n },\n };\n\n // markform_export - Export schema and values as JSON\n const markform_export: MarkformTool<Record<string, never>, ExportToolResult> = {\n description:\n 'Export the form schema and current values as JSON. Use this to get a machine-readable ' +\n 'representation of the form structure and all field values. Useful for processing or analysis.',\n inputSchema: ExportInputSchema,\n execute: () => {\n const form = sessionStore.getForm();\n\n // Count answered fields\n const answeredCount = Object.values(form.responsesByFieldId).filter(\n (response) => response.state === 'answered',\n ).length;\n\n return Promise.resolve({\n success: true,\n data: {\n schema: form.schema,\n values: form.responsesByFieldId,\n },\n message: `Exported form with ${form.schema.groups.length} group(s) and ${answeredCount} answered field(s).`,\n });\n },\n };\n\n // Build the toolset\n const toolset: MarkformToolSet = {\n markform_inspect,\n markform_apply,\n markform_export,\n };\n\n // Optionally include markform_get_markdown\n if (includeGetMarkdown) {\n const markform_get_markdown: MarkformTool<Record<string, never>, GetMarkdownToolResult> = {\n description:\n 'Get the canonical Markdown representation of the current form. ' +\n 'Use this to see the complete form with all current values in Markform format. ' +\n 'The output is deterministic and round-trip safe.',\n inputSchema: GetMarkdownInputSchema,\n execute: () => {\n const form = sessionStore.getForm();\n const markdown = serializeForm(form);\n\n return Promise.resolve({\n success: true,\n data: {\n markdown,\n },\n message: `Generated Markdown (${markdown.length} characters).`,\n });\n },\n };\n\n toolset.markform_get_markdown = markform_get_markdown;\n }\n\n return toolset;\n}\n\n// =============================================================================\n// Convenience Exports\n// =============================================================================\n\nexport { PatchSchema } from '../engine/coreTypes.js';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,IAAa,uBAAb,MAAkC;CAChC,AAAQ;CACR,AAAQ;CAER,YAAY,MAAkB,mBAAuC;AACnE,OAAK,OAAO;AACZ,OAAK,oBAAoB,qBAAqB,EAAE;;;;;CAMlD,UAAsB;AACpB,SAAO,KAAK;;;;;CAMd,uBAA0C;AACxC,SAAO,KAAK;;;;;CAMd,WAAW,MAAwB;AACjC,OAAK,OAAO;;;;;;AAsDhB,MAAM,qBAAqB,EACxB,OAAO,EAAE,CAAC,CACV,SAAS,kFAAkF;;;;AAK9F,MAAM,mBAAmB,EACtB,OAAO,EACN,SAAS,EACN,MAAM,YAAY,CAClB,IAAI,EAAE,CACN,IAAI,GAAG,CACP,SACC,2WAID,EACJ,CAAC,CACD,SAAS,6CAA6C;;;;AAKzD,MAAM,oBAAoB,EACvB,OAAO,EAAE,CAAC,CACV,SACC,qGACD;;;;AAKH,MAAM,yBAAyB,EAC5B,OAAO,EAAE,CAAC,CACV,SACC,iHACD;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BH,SAAgB,oBAAoB,SAAsD;CACxF,MAAM,EAAE,cAAc,qBAAqB,SAAS;CA2FpD,MAAM,UAA2B;EAC/B,kBAzF+E;GAC/E,aACE;GAGF,aAAa;GACb,eAAe;IAEb,MAAM,SAAS,QADF,aAAa,SAAS,CACP;IAE5B,MAAM,gBAAgB,OAAO,OAAO,QAAQ,MAAM,EAAE,aAAa,WAAW,CAAC;IAC7E,MAAM,UAAU,OAAO,aACnB,sDACA,YAAY,cAAc;AAE9B,WAAO,QAAQ,QAAQ;KACrB,SAAS;KACT,MAAM;KACN;KACD,CAAC;;GAEL;EAqEC,gBAlE0E;GAC1E,aACE;GAKF,aAAa;GACb,UAAU,EAAE,cAAc;IACxB,MAAM,OAAO,aAAa,SAAS;IACnC,MAAM,SAAS,aAAa,MAAM,QAAQ;AAG1C,iBAAa,WAAW,KAAK;IAE7B,MAAM,cAAc,OAAO,SAAS,SAAS,IAAI,KAAK,OAAO,SAAS,OAAO,aAAa;IAC1F,MAAM,YAAY,OAAO,OAAO,QAAQ,MAAM,EAAE,aAAa,WAAW,CAAC;IAEzE,MAAM,UACJ,OAAO,gBAAgB,YACnB,WAAW,QAAQ,OAAO,YAAY,YAAY,IAChD,OAAO,aACH,0BACA,GAAG,UAAU,mCAEnB,OAAO,gBAAgB,YACrB,WAAW,OAAO,eAAe,OAAO,GAAG,QAAQ,OAAO,UAAU,YAAY,IAC7E,OAAO,gBAAgB,OAAO,cACjC;AAER,WAAO,QAAQ,QAAQ;KACrB,SAAS,OAAO,gBAAgB;KAChC,MAAM;KACN;KACD,CAAC;;GAEL;EA+BC,iBA5B6E;GAC7E,aACE;GAEF,aAAa;GACb,eAAe;IACb,MAAM,OAAO,aAAa,SAAS;IAGnC,MAAM,gBAAgB,OAAO,OAAO,KAAK,mBAAmB,CAAC,QAC1D,aAAa,SAAS,UAAU,WAClC,CAAC;AAEF,WAAO,QAAQ,QAAQ;KACrB,SAAS;KACT,MAAM;MACJ,QAAQ,KAAK;MACb,QAAQ,KAAK;MACd;KACD,SAAS,sBAAsB,KAAK,OAAO,OAAO,OAAO,gBAAgB,cAAc;KACxF,CAAC;;GAEL;EAOA;AAGD,KAAI,mBAqBF,SAAQ,wBApBkF;EACxF,aACE;EAGF,aAAa;EACb,eAAe;GAEb,MAAM,WAAW,cADJ,aAAa,SAAS,CACC;AAEpC,UAAO,QAAQ,QAAQ;IACrB,SAAS;IACT,MAAM,EACJ,UACD;IACD,SAAS,uBAAuB,SAAS,OAAO;IACjD,CAAC;;EAEL;AAKH,QAAO"}
|
|
1
|
+
{"version":3,"file":"ai-sdk.mjs","names":[],"sources":["../src/integrations/vercelAiSdkTools.ts"],"sourcesContent":["/**\n * AI SDK Integration for Markform.\n *\n * Provides Vercel AI SDK compatible tools for agent-driven form filling.\n * Use createMarkformTools() to create a toolset that wraps the Markform engine.\n *\n * @example\n * ```typescript\n * import { createMarkformTools, MarkformSessionStore } from 'markform/ai-sdk';\n * import { generateText } from 'ai';\n *\n * const store = new MarkformSessionStore(parsedForm);\n * const tools = createMarkformTools({ sessionStore: store });\n *\n * const { text } = await generateText({\n * model: openai('gpt-4'),\n * prompt: 'Fill out this form...',\n * tools,\n * });\n * ```\n */\n\nimport { z } from 'zod';\nimport type {\n Field,\n InspectIssue,\n ParsedForm,\n Patch,\n ValidatorRegistry,\n} from '../engine/coreTypes.js';\nimport { inspect } from '../engine/inspect.js';\nimport { applyPatches } from '../engine/apply.js';\nimport { serializeForm } from '../engine/serialize.js';\nimport { PatchSchema } from '../engine/coreTypes.js';\nimport { getFieldIdFromRef } from '../engine/issueFiltering.js';\nimport { findFieldById } from '../engine/valueCoercion.js';\nimport { getPatchFormatHint } from '../harness/prompts.js';\n\n// =============================================================================\n// Session Store\n// =============================================================================\n\n/**\n * Session store for managing form state during AI interactions.\n *\n * The AI SDK tools operate on a shared form instance through this store.\n * Create one store per form-filling session.\n */\nexport class MarkformSessionStore {\n private form: ParsedForm;\n private validatorRegistry: ValidatorRegistry;\n\n constructor(form: ParsedForm, validatorRegistry?: ValidatorRegistry) {\n this.form = form;\n this.validatorRegistry = validatorRegistry ?? {};\n }\n\n /**\n * Get the current form.\n */\n getForm(): ParsedForm {\n return this.form;\n }\n\n /**\n * Get the validator registry.\n */\n getValidatorRegistry(): ValidatorRegistry {\n return this.validatorRegistry;\n }\n\n /**\n * Update the form values.\n */\n updateForm(form: ParsedForm): void {\n this.form = form;\n }\n}\n\n// =============================================================================\n// Tool Creation Options\n// =============================================================================\n\n/**\n * Options for creating Markform AI SDK tools.\n */\nexport interface CreateMarkformToolsOptions {\n /**\n * Session store managing the form state.\n */\n sessionStore: MarkformSessionStore;\n\n /**\n * Whether to include the markform_get_markdown tool.\n * Defaults to true.\n */\n includeGetMarkdown?: boolean;\n}\n\n// =============================================================================\n// Tool Types (imported from toolTypes.ts)\n// =============================================================================\n\nimport type {\n ApplyToolResult,\n ExportToolResult,\n GetMarkdownToolResult,\n InspectToolResult,\n MarkformTool,\n MarkformToolSet,\n} from './toolTypes.js';\n\n// Re-export types for backwards compatibility\nexport type {\n ApplyToolResult,\n ExportToolResult,\n GetMarkdownToolResult,\n InspectToolResult,\n MarkformTool,\n MarkformToolSet,\n} from './toolTypes.js';\n\n// =============================================================================\n// Zod Schemas for Tool Inputs\n// =============================================================================\n\n/**\n * Input schema for markform_inspect tool (no parameters).\n */\nconst InspectInputSchema = z\n .object({})\n .describe('No input parameters required. Call this tool to inspect the current form state.');\n\n/**\n * Input schema for markform_apply tool.\n */\nconst ApplyInputSchema = z\n .object({\n patches: z\n .array(PatchSchema)\n .min(1)\n .max(20)\n .describe(\n 'Array of patches to apply to the form. Each patch sets or clears a field value. ' +\n 'Set operations: set_string, set_number, set_string_list, set_single_select, set_multi_select, ' +\n 'set_checkboxes, set_url, set_url_list, set_date, set_year, set_table. ' +\n 'Incremental operations: append_table, delete_table, append_string_list, delete_string_list, append_url_list, delete_url_list. ' +\n 'Meta operations: clear_field, skip_field, abort_field. ' +\n 'Example: [{ \"op\": \"set_string\", \"fieldId\": \"name\", \"value\": \"Alice\" }]',\n ),\n })\n .describe('Apply patches to update form field values.');\n\n/**\n * Input schema for markform_export tool (no parameters).\n */\nconst ExportInputSchema = z\n .object({})\n .describe(\n 'No input parameters required. Call this tool to export the form schema and current values as JSON.',\n );\n\n/**\n * Input schema for markform_get_markdown tool (no parameters).\n */\nconst GetMarkdownInputSchema = z\n .object({})\n .describe(\n 'No input parameters required. Call this tool to get the canonical Markdown representation of the current form.',\n );\n\n// =============================================================================\n// Issue Enrichment\n// =============================================================================\n\ninterface EnrichedFieldMeta {\n kind: string;\n label: string;\n required: boolean;\n options?: string[];\n checkbox_mode?: string;\n columns?: { id: string; type: string; required: boolean }[];\n}\n\nfunction buildFieldMeta(field: Field): EnrichedFieldMeta {\n const meta: EnrichedFieldMeta = {\n kind: field.kind,\n label: field.label,\n required: field.required,\n };\n\n if (field.kind === 'single_select' || field.kind === 'multi_select') {\n meta.options = field.options.map((o) => o.id);\n } else if (field.kind === 'checkboxes') {\n meta.options = field.options.map((o) => o.id);\n meta.checkbox_mode = field.checkboxMode;\n } else if (field.kind === 'table') {\n meta.columns = field.columns.map((c) => ({\n id: c.id,\n type: c.type,\n required: c.required,\n }));\n }\n\n return meta;\n}\n\nfunction generatePatchExample(field: Field): string {\n const opts: {\n fieldId: string;\n columnIds?: string[];\n checkboxMode?: 'simple' | 'multi' | 'explicit';\n optionIds?: string[];\n } = {\n fieldId: field.id,\n };\n\n if (field.kind === 'table') {\n opts.columnIds = field.columns.map((c) => c.id);\n } else if (field.kind === 'checkboxes') {\n opts.checkboxMode = field.checkboxMode;\n opts.optionIds = field.options.map((o) => o.id);\n }\n\n return getPatchFormatHint(field.kind, opts);\n}\n\nfunction enrichIssue(\n issue: InspectIssue,\n form: ParsedForm,\n): InspectIssue & {\n field?: EnrichedFieldMeta;\n set_example?: string;\n skip_example?: string | null;\n} {\n const fieldId = getFieldIdFromRef(issue.ref, issue.scope);\n const field = fieldId ? findFieldById(form, fieldId) : undefined;\n\n if (!field) return issue;\n\n return {\n ...issue,\n field: buildFieldMeta(field),\n set_example: generatePatchExample(field),\n skip_example: field.required\n ? null\n : `{ op: \"skip_field\", fieldId: \"${field.id}\", reason: \"Not applicable\" }`,\n };\n}\n\n// =============================================================================\n// Tool Factory\n// =============================================================================\n\n/**\n * Create Markform AI SDK tools for agent-driven form filling.\n *\n * Returns a toolset compatible with Vercel AI SDK's generateText and streamText.\n *\n * @param options - Tool creation options including session store\n * @returns MarkformToolSet containing all tools\n *\n * @example\n * ```typescript\n * import { parseForm } from 'markform';\n * import { createMarkformTools, MarkformSessionStore } from 'markform/ai-sdk';\n *\n * const form = parseForm(markdownContent);\n * const store = new MarkformSessionStore(form);\n * const tools = createMarkformTools({ sessionStore: store });\n *\n * // Use with AI SDK\n * const result = await generateText({\n * model: yourModel,\n * tools,\n * prompt: 'Fill out this form based on the user information...',\n * });\n * ```\n */\nexport function createMarkformTools(options: CreateMarkformToolsOptions): MarkformToolSet {\n const { sessionStore, includeGetMarkdown = true } = options;\n\n // markform_inspect - Get current form state with issues\n const markform_inspect: MarkformTool<Record<string, never>, InspectToolResult> = {\n description:\n 'Inspect the current form state. Returns structure summary, progress summary, validation issues, ' +\n 'and completion status. Use this to understand what fields need to be filled and what issues exist. ' +\n \"Issues are sorted by priority (1 = highest). Focus on 'required' severity issues first.\",\n inputSchema: InspectInputSchema,\n execute: () => {\n const form = sessionStore.getForm();\n const result = inspect(form);\n\n // Enrich issues with field metadata and patch examples\n const enrichedIssues = result.issues.map((issue) => enrichIssue(issue, form));\n\n const requiredCount = result.issues.filter((i) => i.severity === 'required').length;\n const message = result.isComplete\n ? 'Form is complete. All required fields are filled.'\n : `Form has ${requiredCount} required issue(s) to resolve.`;\n\n return Promise.resolve({\n success: true,\n data: { ...result, issues: enrichedIssues },\n message,\n });\n },\n };\n\n // markform_apply - Apply patches to update form values\n const markform_apply: MarkformTool<{ patches: Patch[] }, ApplyToolResult> = {\n description:\n 'Apply patches to update form field values. Valid patches are applied even if some fail. ' +\n 'Single values are automatically coerced to arrays for list fields. ' +\n 'Returns applied patches, warnings for coerced values, and rejected patches separately. ' +\n 'Set operations: set_string, set_number, set_string_list, set_single_select, set_multi_select, ' +\n 'set_checkboxes, set_url, set_url_list, set_date, set_year, set_table. ' +\n 'Incremental: append_table, delete_table, append_string_list, delete_string_list, append_url_list, delete_url_list. ' +\n 'Meta: clear_field, skip_field, abort_field.',\n inputSchema: ApplyInputSchema,\n execute: ({ patches }) => {\n const form = sessionStore.getForm();\n const result = applyPatches(form, patches);\n\n // Update the store with the modified form\n sessionStore.updateForm(form);\n\n const warningNote = result.warnings.length > 0 ? ` (${result.warnings.length} coerced)` : '';\n const remaining = result.issues.filter((i) => i.severity === 'required').length;\n\n const message =\n result.applyStatus === 'applied'\n ? `Applied ${patches.length} patch(es)${warningNote}. ${\n result.isComplete\n ? 'Form is now complete!'\n : `${remaining} required issue(s) remaining.`\n }`\n : result.applyStatus === 'partial'\n ? `Applied ${result.appliedPatches.length}/${patches.length} patches${warningNote}. ` +\n `${result.rejectedPatches.length} rejected.`\n : `All patches rejected. Check field IDs and value types.`;\n\n return Promise.resolve({\n success: result.applyStatus !== 'rejected',\n data: result,\n message,\n });\n },\n };\n\n // markform_export - Export schema and values as JSON\n const markform_export: MarkformTool<Record<string, never>, ExportToolResult> = {\n description:\n 'Export the form schema and current values as JSON. Use this to get a machine-readable ' +\n 'representation of the form structure and all field values. Useful for processing or analysis.',\n inputSchema: ExportInputSchema,\n execute: () => {\n const form = sessionStore.getForm();\n\n // Count answered fields\n const answeredCount = Object.values(form.responsesByFieldId).filter(\n (response) => response.state === 'answered',\n ).length;\n\n return Promise.resolve({\n success: true,\n data: {\n schema: form.schema,\n values: form.responsesByFieldId,\n },\n message: `Exported form with ${form.schema.groups.length} group(s) and ${answeredCount} answered field(s).`,\n });\n },\n };\n\n // Build the toolset\n const toolset: MarkformToolSet = {\n markform_inspect,\n markform_apply,\n markform_export,\n };\n\n // Optionally include markform_get_markdown\n if (includeGetMarkdown) {\n const markform_get_markdown: MarkformTool<Record<string, never>, GetMarkdownToolResult> = {\n description:\n 'Get the canonical Markdown representation of the current form. ' +\n 'Use this to see the complete form with all current values in Markform format. ' +\n 'The output is deterministic and round-trip safe.',\n inputSchema: GetMarkdownInputSchema,\n execute: () => {\n const form = sessionStore.getForm();\n const markdown = serializeForm(form);\n\n return Promise.resolve({\n success: true,\n data: {\n markdown,\n },\n message: `Generated Markdown (${markdown.length} characters).`,\n });\n },\n };\n\n toolset.markform_get_markdown = markform_get_markdown;\n }\n\n return toolset;\n}\n\n// =============================================================================\n// Convenience Exports\n// =============================================================================\n\nexport { PatchSchema } from '../engine/coreTypes.js';\n"],"mappings":"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"}
|
package/dist/bin.mjs
CHANGED