@eigenpal/cli 0.15.1 → 0.16.1

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,175 @@
1
+ # eigenpal email-servers
2
+
3
+ Manage outbound email servers (ems\_…): list, inspect, create, update, delete, and send a real test message.
4
+
5
+ ## Contents
6
+
7
+ - [Surface](#surface)
8
+ - [Commands](#commands)
9
+ - [Core](#core)
10
+ - [Details](#details)
11
+ - [`eigenpal email-servers|email-server list|ls [options]`](#eigenpal-email-serversemail-server-listls-options)
12
+ - [`eigenpal email-servers|email-server get [options] <id>`](#eigenpal-email-serversemail-server-get-options-id)
13
+ - [`eigenpal email-servers|email-server create [options]`](#eigenpal-email-serversemail-server-create-options)
14
+ - [`eigenpal email-servers|email-server update [options] <id>`](#eigenpal-email-serversemail-server-update-options-id)
15
+ - [`eigenpal email-servers|email-server delete [options] <id>`](#eigenpal-email-serversemail-server-delete-options-id)
16
+ - [`eigenpal email-servers|email-server test [options] <id>`](#eigenpal-email-serversemail-server-test-options-id)
17
+
18
+ ## Surface
19
+
20
+ ```
21
+ email-servers
22
+ ├── list|ls
23
+ ├── get <id>
24
+ ├── create
25
+ ├── update <id>
26
+ ├── delete <id>
27
+ └── test <id>
28
+ ```
29
+
30
+ ## Commands
31
+
32
+ ### Core
33
+
34
+ | Command | Description |
35
+ | ------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
36
+ | `eigenpal email-servers\|email-server list\|ls [options]` | List outbound email servers for the current workspace. |
37
+ | `eigenpal email-servers\|email-server get [options] <id>` | Inspect one email server. Human output is redacted even if the API regresses. |
38
+ | `eigenpal email-servers\|email-server create [options]` | Create an outbound email server. Resend requires an API key; SMTP accepts optional username/password except with --security none, plus optional CA PEM, and defaults to starttls on port 587. |
39
+ | `eigenpal email-servers\|email-server update [options] <id>` | Update metadata or replace transport configuration. Omitted secrets are retained. Passing --transport smtp requires --host, --port, --security, --from-email, and --from-name (no security/port defaults). Metadata-only updates omit --transport. |
40
+ | `eigenpal email-servers\|email-server delete [options] <id>` | Soft-delete an outbound email server. |
41
+ | `eigenpal email-servers\|email-server test [options] <id>` | Send a real connectivity test email through the stored server to --to. Disabled servers fail with a conflict. |
42
+
43
+ ## Details
44
+
45
+ ### `eigenpal email-servers|email-server list|ls [options]`
46
+
47
+ List outbound email servers for the current workspace.
48
+
49
+ ### Options
50
+
51
+ | Flag | Required | Default | Description |
52
+ | ------------------ | -------- | ------- | ------------------------------------ |
53
+ | `--limit <n>` | no | `50` | Page size |
54
+ | `--offset <n>` | no | `0` | Page offset |
55
+ | `--base-url <url>` | no | | Server base URL |
56
+ | `--json` | no | | Emit machine-readable JSON on stdout |
57
+
58
+ ### `eigenpal email-servers|email-server get [options] <id>`
59
+
60
+ Inspect one email server. Human output is redacted even if the API regresses.
61
+
62
+ ### Arguments
63
+
64
+ | Name | Required | Variadic | Description |
65
+ | ---- | -------- | -------- | ----------- |
66
+ | `id` | yes | no | |
67
+
68
+ ### Options
69
+
70
+ | Flag | Required | Default | Description |
71
+ | ------------------ | -------- | ------- | ------------------------------------ |
72
+ | `--base-url <url>` | no | | Server base URL |
73
+ | `--json` | no | | Emit machine-readable JSON on stdout |
74
+
75
+ ### `eigenpal email-servers|email-server create [options]`
76
+
77
+ Create an outbound email server. Resend requires an API key; SMTP accepts optional username/password except with --security none, plus optional CA PEM, and defaults to starttls on port 587.
78
+
79
+ ### Options
80
+
81
+ | Flag | Required | Default | Description |
82
+ | ------------------------ | -------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
83
+ | `--config-json <json>` | no | | JSON object (non-secret fields only; use secret _-stdin/_-file flags) |
84
+ | `--config-file <path>` | no | | JSON file path (`-` reads stdin; non-secret fields only) |
85
+ | `--name <name>` | no | | Display name |
86
+ | `--transport <kind>` | no | | Transport: resend or smtp |
87
+ | `--from-email <email>` | no | | From address |
88
+ | `--from-name <name>` | no | | From display name (no control characters or <>) |
89
+ | `--enabled` | no | | Enable the server (default on create) |
90
+ | `--disabled` | no | | Disable the server |
91
+ | `--host <host>` | no | | SMTP host (required on update when --transport smtp) |
92
+ | `--port <n>` | no | | SMTP port. Required on update when --transport smtp; create defaults from --security |
93
+ | `--security <mode>` | no | | SMTP security: starttls, tls, or none (unauthenticated trusted relays; credentials are rejected). Required on update when --transport smtp; create defaults to starttls |
94
+ | `--username <user>` | no | | SMTP username (non-secret) |
95
+ | `--api-key-stdin` | no | | Read the Resend API key from stdin |
96
+ | `--api-key-file <path>` | no | | Read the Resend API key from a file (`-` for stdin) |
97
+ | `--password-stdin` | no | | Read the SMTP password from stdin |
98
+ | `--password-file <path>` | no | | Read the SMTP password from a file (`-` for stdin) |
99
+ | `--ca-pem-stdin` | no | | Read a custom SMTP CA PEM from stdin |
100
+ | `--ca-pem-file <path>` | no | | Read a custom SMTP CA PEM from a file (`-` for stdin) |
101
+ | `--base-url <url>` | no | | Server base URL |
102
+ | `--json` | no | | Emit machine-readable JSON on stdout |
103
+
104
+ ### `eigenpal email-servers|email-server update [options] <id>`
105
+
106
+ Update metadata or replace transport configuration. Omitted secrets are retained. Passing --transport smtp requires --host, --port, --security, --from-email, and --from-name (no security/port defaults). Metadata-only updates omit --transport.
107
+
108
+ ### Arguments
109
+
110
+ | Name | Required | Variadic | Description |
111
+ | ---- | -------- | -------- | ----------- |
112
+ | `id` | yes | no | |
113
+
114
+ ### Options
115
+
116
+ | Flag | Required | Default | Description |
117
+ | ------------------------ | -------- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
118
+ | `--config-json <json>` | no | | JSON object (non-secret fields only; use secret _-stdin/_-file flags) |
119
+ | `--config-file <path>` | no | | JSON file path (`-` reads stdin; non-secret fields only) |
120
+ | `--name <name>` | no | | Display name |
121
+ | `--transport <kind>` | no | | Transport: resend or smtp |
122
+ | `--from-email <email>` | no | | From address |
123
+ | `--from-name <name>` | no | | From display name (no control characters or <>) |
124
+ | `--enabled` | no | | Enable the server (default on create) |
125
+ | `--disabled` | no | | Disable the server |
126
+ | `--host <host>` | no | | SMTP host (required on update when --transport smtp) |
127
+ | `--port <n>` | no | | SMTP port. Required on update when --transport smtp; create defaults from --security |
128
+ | `--security <mode>` | no | | SMTP security: starttls, tls, or none (unauthenticated trusted relays; credentials are rejected). Required on update when --transport smtp; create defaults to starttls |
129
+ | `--username <user>` | no | | SMTP username (non-secret) |
130
+ | `--api-key-stdin` | no | | Read the Resend API key from stdin |
131
+ | `--api-key-file <path>` | no | | Read the Resend API key from a file (`-` for stdin) |
132
+ | `--password-stdin` | no | | Read the SMTP password from stdin |
133
+ | `--password-file <path>` | no | | Read the SMTP password from a file (`-` for stdin) |
134
+ | `--ca-pem-stdin` | no | | Read a custom SMTP CA PEM from stdin |
135
+ | `--ca-pem-file <path>` | no | | Read a custom SMTP CA PEM from a file (`-` for stdin) |
136
+ | `--clear-ca-pem` | no | | Remove a stored custom SMTP CA certificate |
137
+ | `--clear-username` | no | | Clear stored SMTP username/password pair |
138
+ | `--base-url <url>` | no | | Server base URL |
139
+ | `--json` | no | | Emit machine-readable JSON on stdout |
140
+
141
+ ### `eigenpal email-servers|email-server delete [options] <id>`
142
+
143
+ Soft-delete an outbound email server.
144
+
145
+ ### Arguments
146
+
147
+ | Name | Required | Variadic | Description |
148
+ | ---- | -------- | -------- | ----------- |
149
+ | `id` | yes | no | |
150
+
151
+ ### Options
152
+
153
+ | Flag | Required | Default | Description |
154
+ | ------------------ | -------- | ------- | ------------------------------------ |
155
+ | `--yes` | no | `false` | Required for non-TTY shells |
156
+ | `--base-url <url>` | no | | Server base URL |
157
+ | `--json` | no | | Emit machine-readable JSON on stdout |
158
+
159
+ ### `eigenpal email-servers|email-server test [options] <id>`
160
+
161
+ Send a real connectivity test email through the stored server to --to. Disabled servers fail with a conflict.
162
+
163
+ ### Arguments
164
+
165
+ | Name | Required | Variadic | Description |
166
+ | ---- | -------- | -------- | ----------- |
167
+ | `id` | yes | no | |
168
+
169
+ ### Options
170
+
171
+ | Flag | Required | Default | Description |
172
+ | ------------------ | -------- | ------- | ------------------------------------ |
173
+ | `--to <email>` | yes | | Recipient for the live test message |
174
+ | `--base-url <url>` | no | | Server base URL |
175
+ | `--json` | no | | Emit machine-readable JSON on stdout |
@@ -114,6 +114,13 @@ eigenpal
114
114
  │ └── pull [target]
115
115
  ├── models
116
116
  │ └── list|ls
117
+ ├── email-servers|email-server
118
+ │ ├── list|ls
119
+ │ ├── get <id>
120
+ │ ├── create
121
+ │ ├── update <id>
122
+ │ ├── delete <id>
123
+ │ └── test <id>
117
124
  ├── run <target>
118
125
  ├── rerun <run-id>
119
126
  ├── runs
@@ -356,7 +356,7 @@ _Generated from `EvalConfigYamlSchema` in `@eigenpal/types/src/eval/evaluator-co
356
356
  | Field | Type | Required | Default | Description |
357
357
  | --- | --- | --- | --- | --- |
358
358
  | `model` | string | no | | Which LLM grades the output. Falls back to the workspace's default LLM provider when unset. |
359
- | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
359
+ | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
360
360
  | `mode` | `"continuous"` \| `"discrete"` | no | `"continuous"` | Continuous = the LLM returns a free-form score in [0, 1]. Discrete = the LLM picks one of your labels and the score is looked up from the table. |
361
361
  | `labels` | record<string, number> | no | | Allowed labels and the score each maps to. Required in discrete mode. The judge MUST return one of these labels; each score must be in [0, 1]. |
362
362
  | `passThreshold` | number | no | | Legacy per-evaluator pass threshold. Pass/fail now uses the single workflow-level pass threshold; this is read only to preserve the run gate of configs authored before the single-threshold model. |
@@ -562,7 +562,7 @@ Generated from the same discriminated union used by evaluator validation; YAML k
562
562
  "minLength": 1
563
563
  },
564
564
  "reasoningEffort": {
565
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
565
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
566
566
  "type": "string",
567
567
  "enum": [
568
568
  "none",
@@ -426,9 +426,9 @@ Extract text from documents (PDF, DOCX, images) using native extraction, OCR, or
426
426
  | `parseMode` | `"ocr"` \| `"vision"` \| `"native"` \| `"native-or-ocr"` | no | | Base parser for PDF/image inputs. OCR is the default; vision uses the selected LLM. `native` extracts PDF embedded text only and never calls OCR or vision. `native-or-ocr` extracts native text, runs page-quality diagnostics, and requests OCR when pages have detectable anomalies (empty, U+FFFD, lone surrogates, forbidden controls, unassigned/noncharacter, heavy PUA). Page selection, subset egress, and billing are provider-dependent. Valid-looking wrong text and literal "?" are not flagged. Text and Office files always use local parsing. |
427
427
  | `ocrModel` | string | no | | OCR provider ID for PDF/image parsing |
428
428
  | `llmModel` | string | no | | LLM provider ID for vision-based parsing |
429
- | `llmReasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
429
+ | `llmReasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
430
430
  | `figureModel` | string | no | | Vision model used only for the optional figure-description pass |
431
- | `figureReasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
431
+ | `figureReasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
432
432
  | `maxConcurrency` | number | no | `3` | Max concurrent VLM batch requests |
433
433
  | `pagesPerBatch` | number | no | `5` | Number of page images per VLM request |
434
434
  | `pdfRenderScale` | number | no | `1` | Scale factor for rendering PDF pages before VLM parsing. Higher values produce sharper images at larger payload sizes. |
@@ -486,7 +486,7 @@ Config schema:
486
486
  "type": "string"
487
487
  },
488
488
  "llmReasoningEffort": {
489
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
489
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
490
490
  "type": "string",
491
491
  "enum": [
492
492
  "none",
@@ -503,7 +503,7 @@ Config schema:
503
503
  "type": "string"
504
504
  },
505
505
  "figureReasoningEffort": {
506
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
506
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
507
507
  "type": "string",
508
508
  "enum": [
509
509
  "none",
@@ -1390,11 +1390,11 @@ Extract structured data from text using AI with a JSON schema
1390
1390
  | `prompt` | string | no | | Custom prompt template for extraction |
1391
1391
  | `provider` | string | no | | Provider ID (e.g., "openai-gpt4o") |
1392
1392
  | `model` | string | no | | Model override |
1393
- | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
1393
+ | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
1394
1394
  | `maxInputTokens` | integer | no | | Max input tokens. Truncates input text and logs a warning when exceeded. Omit for no limit. |
1395
1395
  | `grounded` | boolean | no | | Grounding is ON by default: each schema field gets a source span + confidence (high=verbatim, medium=fuzzy, low=ungrounded) under a reserved `_grounding` output key, and fields whose value cannot be located in the source are flagged for human review. Values stay the reliable schema-typed ones. The pass runs through the workspace LLM (any provider) and chunks long documents automatically. Tri-state: unset (default) = on, degrading gracefully to deterministic text alignment (`_grounding._degraded: true`) if no grounding model is available; `true` = strict, the step fails when the grounding model cannot be resolved; `false` = off, no `_grounding` key at all. |
1396
1396
  | `groundingModel` | string | no | | Provider/model for the grounding pass. Defaults to the workspace default LLM. Any configured provider works; the pass only fails the step when `grounded: true` is set explicitly and no model resolves. |
1397
- | `groundingReasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
1397
+ | `groundingReasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
1398
1398
  | `groundingExamples` | array<object> | no | | Optional few-shot examples pinning grounding to verbatim source text per field. |
1399
1399
  | `reviewOn` | `"medium_or_low"` \| `"low_only"` | no | | Which grounding confidences set needsReview on a field. Default: low_only (only fields whose value could not be located in the source). Use medium_or_low to also flag approximate and derived matches. |
1400
1400
 
@@ -1456,7 +1456,7 @@ Config schema:
1456
1456
  "type": "string"
1457
1457
  },
1458
1458
  "reasoningEffort": {
1459
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
1459
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
1460
1460
  "type": "string",
1461
1461
  "enum": [
1462
1462
  "none",
@@ -1483,7 +1483,7 @@ Config schema:
1483
1483
  "type": "string"
1484
1484
  },
1485
1485
  "groundingReasoningEffort": {
1486
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
1486
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
1487
1487
  "type": "string",
1488
1488
  "enum": [
1489
1489
  "none",
@@ -1580,7 +1580,7 @@ Split a parsed document into named sections using an LLM. Consumes ai.parse outp
1580
1580
  | `sections` | array<object> | yes | | Named sections to find in the document |
1581
1581
  | `rules` | string | no | | Optional natural-language rules appended to the system prompt. E.g. "End-of-section markers like *Koniec prílohy 2* close the current section." |
1582
1582
  | `provider` | string | no | | Provider ID from eigenpal.config.yaml (e.g. "openai-gpt5.4-mini"). Falls back to the tenant default LLM provider when omitted. |
1583
- | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
1583
+ | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
1584
1584
  | `windowTokenBudget` | integer | no | | Override the per-window token ceiling for this step. Defaults to env SPLIT_WINDOW_TOKEN_BUDGET or 20000. Smaller windows give sharper anchors on contract-style documents (less competing context for the LLM to mis-anchor on); bump to 50k–100k when sections routinely exceed per-window page count. |
1585
1585
 
1586
1586
  **Output:** `object`
@@ -1648,7 +1648,7 @@ Config schema:
1648
1648
  "type": "string"
1649
1649
  },
1650
1650
  "reasoningEffort": {
1651
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
1651
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
1652
1652
  "type": "string",
1653
1653
  "enum": [
1654
1654
  "none",
@@ -2052,7 +2052,7 @@ Separate a concatenated batch (one big scan) into typed document instances using
2052
2052
  | `documentTypes` | array<object> | yes | | The document-type taxonomy. The LLM tags each detected document with one of these names, or the reserved "unknown" type when none fit. |
2053
2053
  | `rules` | string | no | | Optional natural-language rules appended to the system prompt. |
2054
2054
  | `provider` | string | no | | Provider ID from eigenpal.config.yaml. Falls back to the tenant default LLM provider when omitted. |
2055
- | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
2055
+ | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
2056
2056
  | `windowTokenBudget` | integer | no | | Override the per-window token ceiling. Defaults to env SPLIT_WINDOW_TOKEN_BUDGET or 20000. |
2057
2057
 
2058
2058
  **Output:** `object`
@@ -2107,7 +2107,7 @@ Config schema:
2107
2107
  "type": "string"
2108
2108
  },
2109
2109
  "reasoningEffort": {
2110
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
2110
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
2111
2111
  "type": "string",
2112
2112
  "enum": [
2113
2113
  "none",
@@ -2416,7 +2416,7 @@ Classify a document or text into one of a fixed label set using an LLM. Output e
2416
2416
  | `prompt` | string | no | | Custom classification instructions appended to the system prompt. Use to clarify edge cases or emphasize evidence the model should weigh. |
2417
2417
  | `provider` | string | no | | Provider ID from eigenpal.config.yaml (e.g. "openai-gpt4o-mini"). Falls back to the tenant default LLM provider when omitted. |
2418
2418
  | `model` | string | no | | Model override (advanced) |
2419
- | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
2419
+ | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
2420
2420
  | `maxInputTokens` | integer | no | | Max input tokens. Truncates input text when exceeded. Omit for no limit. |
2421
2421
 
2422
2422
  **Output:** `object`
@@ -2476,7 +2476,7 @@ Config schema:
2476
2476
  "type": "string"
2477
2477
  },
2478
2478
  "reasoningEffort": {
2479
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
2479
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
2480
2480
  "type": "string",
2481
2481
  "enum": [
2482
2482
  "none",
@@ -2556,7 +2556,7 @@ Assign zero or more labels to each page independently (multi-label) using an LLM
2556
2556
  | `prompt` | string | no | | Extra classification guidance appended to the system prompt. |
2557
2557
  | `provider` | string | no | | Provider ID from eigenpal.config.yaml. Falls back to the tenant default. |
2558
2558
  | `model` | string | no | | Model override (advanced). |
2559
- | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
2559
+ | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
2560
2560
  | `windowTokenBudget` | integer | no | | Per-window token ceiling. Pages are packed into windows under this budget; one LLM call per window. Defaults to env SPLIT_WINDOW_TOKEN_BUDGET (20000). |
2561
2561
 
2562
2562
  **Output:** `object`
@@ -2623,7 +2623,7 @@ Config schema:
2623
2623
  "type": "string"
2624
2624
  },
2625
2625
  "reasoningEffort": {
2626
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
2626
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
2627
2627
  "type": "string",
2628
2628
  "enum": [
2629
2629
  "none",
@@ -2729,7 +2729,7 @@ Inspect rendered page images with a vision model and return structured JSON matc
2729
2729
  | `prompt` | string | no | | Optional instruction refining the extraction. The schema drives it when omitted. |
2730
2730
  | `provider` | string | no | | Provider ID (must support vision). |
2731
2731
  | `model` | string | no | | Model override (must support vision). |
2732
- | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to preserve the current provider default. |
2732
+ | `reasoningEffort` | `"none"` \| `"minimal"` \| `"low"` \| `"medium"` \| `"high"` \| `"xhigh"` \| `"max"` | no | | Reasoning effort for models that support it. Omit to use the selected model's default. |
2733
2733
  | `renderScale` | number | no | | PDF render scale (1.0 = 72 DPI). Raise for small text or weak VLM OCR. Capped at 6 to avoid oversized page rasters. |
2734
2734
  | `imageQuality` | integer | no | | JPEG quality for rendered pages (default 85). |
2735
2735
  | `maxPages` | integer | no | | Chunk size: the maximum pages sent to the vision model in a single call. When the inspected range (or the whole document) is larger, it is split into chunks of this size and the per-chunk results are merged by a reduce pass. The reduce follows each field's DESCRIPTION: a boolean described as "present on any page" is OR-ed, one described as "true for every page" is AND-ed, and list fields are concatenated. The merge is most reliable for boolean/scalar claims; for schemas that AGGREGATE long lists across chunks it can still drop or reorder items, so prefer a bounded page range for large list extraction. Default 20, capped at 100. |
@@ -2882,7 +2882,7 @@ Config schema:
2882
2882
  "type": "string"
2883
2883
  },
2884
2884
  "reasoningEffort": {
2885
- "description": "Reasoning effort for models that support it. Omit to preserve the current provider default.",
2885
+ "description": "Reasoning effort for models that support it. Omit to use the selected model's default.",
2886
2886
  "type": "string",
2887
2887
  "enum": [
2888
2888
  "none",
@@ -5025,6 +5025,252 @@ Output schema:
5025
5025
  ```
5026
5026
 
5027
5027
 
5028
+ #### `action.email` — Send Email
5029
+
5030
+ Send an email with optional attachments via a selected email server. At most 10 recipients combined across to, cc, and bcc.
5031
+
5032
+ **Behavior and examples:** `eigenpal docs read steps/action/email`
5033
+
5034
+ **Durable retry:** This control step is not retried durably.
5035
+
5036
+ **Config** (in `step.with`):
5037
+
5038
+ | Field | Type | Required | Default | Description |
5039
+ | --- | --- | --- | --- | --- |
5040
+ | `server` | string | yes | | Outbound email server id (`ems_…`) |
5041
+ | `to` | string \| array<string> | yes | | Primary recipient(s). String, comma-separated list, or nonempty string array. Combined with cc and bcc, at most 10 recipients. |
5042
+ | `cc` | string \| array<string> | no | | Carbon-copy recipient(s). String, comma-separated list, or string array. Combined with to and bcc, at most 10 recipients. |
5043
+ | `bcc` | string \| array<string> | no | | Blind carbon-copy recipient(s). String, comma-separated list, or string array. Combined with to and cc, at most 10 recipients. |
5044
+ | `replyTo` | string | no | | Reply-To address (supports template expressions) |
5045
+ | `subject` | string | yes | | Email subject |
5046
+ | `text` | string | yes | | Plain-text email body (max 50KiB) |
5047
+ | `attachments` | array<string \| object> | no | | Optional same-run attachments as { fileId, filename? } or a bare fileId string (12MiB combined) |
5048
+
5049
+ **Output:** `object`
5050
+
5051
+ | Field | Type | Required | Default | Description |
5052
+ | --- | --- | --- | --- | --- |
5053
+ | `serverId` | string | yes | | Email server that sent (or would have sent) the message |
5054
+ | `messageId` | string \| null | yes | | Provider message id. Null when delivery was skipped (evaluation runs). |
5055
+ | `provider` | `"resend"` \| `"smtp"` \| null | yes | | Email provider that sent the message. Null when delivery was skipped. |
5056
+ | `to` | array<string> | yes | | Normalized To recipients |
5057
+ | `cc` | array<string> | yes | | Normalized Cc recipients |
5058
+ | `bcc` | array<string> | yes | | Normalized Bcc recipients |
5059
+ | `attachmentCount` | integer | yes | | Number of attachments sent |
5060
+ | `totalBytes` | integer | yes | | Total attachment size in bytes |
5061
+
5062
+ ##### Complete machine-readable schemas
5063
+
5064
+ Config schema:
5065
+
5066
+ ```json
5067
+ {
5068
+ "$schema": "http://json-schema.org/draft-07/schema#",
5069
+ "type": "object",
5070
+ "properties": {
5071
+ "server": {
5072
+ "type": "string",
5073
+ "maxLength": 128,
5074
+ "pattern": "^ems_[A-Za-z0-9_-]+$",
5075
+ "description": "Outbound email server id (`ems_…`)"
5076
+ },
5077
+ "to": {
5078
+ "anyOf": [
5079
+ {
5080
+ "type": "string",
5081
+ "minLength": 1
5082
+ },
5083
+ {
5084
+ "minItems": 1,
5085
+ "type": "array",
5086
+ "items": {
5087
+ "type": "string",
5088
+ "minLength": 1
5089
+ }
5090
+ }
5091
+ ],
5092
+ "description": "Primary recipient(s). String, comma-separated list, or nonempty string array. Combined with cc and bcc, at most 10 recipients."
5093
+ },
5094
+ "cc": {
5095
+ "description": "Carbon-copy recipient(s). String, comma-separated list, or string array. Combined with to and bcc, at most 10 recipients.",
5096
+ "anyOf": [
5097
+ {
5098
+ "type": "string",
5099
+ "minLength": 1
5100
+ },
5101
+ {
5102
+ "type": "array",
5103
+ "items": {
5104
+ "type": "string",
5105
+ "minLength": 1
5106
+ }
5107
+ }
5108
+ ]
5109
+ },
5110
+ "bcc": {
5111
+ "description": "Blind carbon-copy recipient(s). String, comma-separated list, or string array. Combined with to and cc, at most 10 recipients.",
5112
+ "anyOf": [
5113
+ {
5114
+ "type": "string",
5115
+ "minLength": 1
5116
+ },
5117
+ {
5118
+ "type": "array",
5119
+ "items": {
5120
+ "type": "string",
5121
+ "minLength": 1
5122
+ }
5123
+ }
5124
+ ]
5125
+ },
5126
+ "replyTo": {
5127
+ "description": "Reply-To address (supports template expressions)",
5128
+ "type": "string",
5129
+ "minLength": 1
5130
+ },
5131
+ "subject": {
5132
+ "type": "string",
5133
+ "minLength": 1,
5134
+ "description": "Email subject"
5135
+ },
5136
+ "text": {
5137
+ "type": "string",
5138
+ "minLength": 1,
5139
+ "description": "Plain-text email body (max 50KiB)"
5140
+ },
5141
+ "attachments": {
5142
+ "description": "Optional same-run attachments as { fileId, filename? } or a bare fileId string (12MiB combined)",
5143
+ "maxItems": 10,
5144
+ "type": "array",
5145
+ "items": {
5146
+ "anyOf": [
5147
+ {
5148
+ "type": "string",
5149
+ "minLength": 1,
5150
+ "description": "File id or template expression that resolves to a file id"
5151
+ },
5152
+ {
5153
+ "type": "object",
5154
+ "properties": {
5155
+ "fileId": {
5156
+ "type": "string",
5157
+ "minLength": 1,
5158
+ "description": "File id or template expression that resolves to a file id"
5159
+ },
5160
+ "filename": {
5161
+ "description": "Optional download filename override",
5162
+ "type": "string",
5163
+ "minLength": 1
5164
+ }
5165
+ },
5166
+ "required": [
5167
+ "fileId"
5168
+ ],
5169
+ "additionalProperties": false
5170
+ }
5171
+ ]
5172
+ }
5173
+ }
5174
+ },
5175
+ "required": [
5176
+ "server",
5177
+ "to",
5178
+ "subject",
5179
+ "text"
5180
+ ],
5181
+ "additionalProperties": false
5182
+ }
5183
+ ```
5184
+
5185
+
5186
+ Output schema:
5187
+
5188
+ ```json
5189
+ {
5190
+ "$schema": "http://json-schema.org/draft-07/schema#",
5191
+ "type": "object",
5192
+ "properties": {
5193
+ "serverId": {
5194
+ "type": "string",
5195
+ "maxLength": 128,
5196
+ "pattern": "^ems_[A-Za-z0-9_-]+$",
5197
+ "description": "Email server that sent (or would have sent) the message"
5198
+ },
5199
+ "messageId": {
5200
+ "anyOf": [
5201
+ {
5202
+ "type": "string"
5203
+ },
5204
+ {
5205
+ "type": "null"
5206
+ }
5207
+ ],
5208
+ "description": "Provider message id. Null when delivery was skipped (evaluation runs)."
5209
+ },
5210
+ "provider": {
5211
+ "anyOf": [
5212
+ {
5213
+ "type": "string",
5214
+ "enum": [
5215
+ "resend",
5216
+ "smtp"
5217
+ ]
5218
+ },
5219
+ {
5220
+ "type": "null"
5221
+ }
5222
+ ],
5223
+ "description": "Email provider that sent the message. Null when delivery was skipped."
5224
+ },
5225
+ "to": {
5226
+ "type": "array",
5227
+ "items": {
5228
+ "type": "string"
5229
+ },
5230
+ "description": "Normalized To recipients"
5231
+ },
5232
+ "cc": {
5233
+ "type": "array",
5234
+ "items": {
5235
+ "type": "string"
5236
+ },
5237
+ "description": "Normalized Cc recipients"
5238
+ },
5239
+ "bcc": {
5240
+ "type": "array",
5241
+ "items": {
5242
+ "type": "string"
5243
+ },
5244
+ "description": "Normalized Bcc recipients"
5245
+ },
5246
+ "attachmentCount": {
5247
+ "type": "integer",
5248
+ "minimum": 0,
5249
+ "maximum": 9007199254740991,
5250
+ "description": "Number of attachments sent"
5251
+ },
5252
+ "totalBytes": {
5253
+ "type": "integer",
5254
+ "minimum": 0,
5255
+ "maximum": 9007199254740991,
5256
+ "description": "Total attachment size in bytes"
5257
+ }
5258
+ },
5259
+ "required": [
5260
+ "serverId",
5261
+ "messageId",
5262
+ "provider",
5263
+ "to",
5264
+ "cc",
5265
+ "bcc",
5266
+ "attachmentCount",
5267
+ "totalBytes"
5268
+ ],
5269
+ "additionalProperties": false
5270
+ }
5271
+ ```
5272
+
5273
+
5028
5274
  ### Control steps — flow control
5029
5275
 
5030
5276
  #### `control.if` — Condition
@@ -1215,7 +1215,8 @@ This JSON Schema is generated from the same Zod schema used to parse workflow YA
1215
1215
  "enum": [
1216
1216
  "action.http",
1217
1217
  "action.invoke-workflow",
1218
- "action.website-reader"
1218
+ "action.website-reader",
1219
+ "action.email"
1219
1220
  ]
1220
1221
  },
1221
1222
  "name": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eigenpal/cli",
3
- "version": "0.15.1",
3
+ "version": "0.16.1",
4
4
  "description": "Eigenpal CLI — author and run document workflows from your terminal. Agent-ready.",
5
5
  "keywords": [
6
6
  "eigenpal",