@eigenpal/cli 0.20.40 → 0.20.42

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.
@@ -317,7 +317,7 @@ the combined shape:
317
317
  ```yaml
318
318
  steps:
319
319
  - name: parse
320
- type: ai.parse
320
+ type: ai.parse-v2
321
321
  with: { ... }
322
322
  - name: extract
323
323
  type: ai.extract
@@ -422,7 +422,9 @@ the final shape in a trailing `transform.script` that handles both cases.
422
422
  top-level keys under `steps.<this-step>.output`, with a `files` array alongside.
423
423
  Invoked workflow steps run in an isolated scope inside the parent run.
424
424
 
425
- For a separate child run (lineage, fire-and-forget, polling), set `execution: child`.
425
+ For a separate child run with lineage, set `execution: child`. Waiting for the
426
+ child releases worker capacity and resumes automatically when the child finishes.
427
+ Set `wait: false` for fire-and-forget execution.
426
428
 
427
429
  ## Classify-and-fail pattern
428
430
 
@@ -434,7 +436,7 @@ process.
434
436
 
435
437
  ```yaml
436
438
  - name: parse
437
- type: ai.parse
439
+ type: ai.parse-v2
438
440
  with:
439
441
  input: '{{ input.document }}'
440
442
 
@@ -1726,9 +1728,9 @@ Output schema:
1726
1728
  ```
1727
1729
 
1728
1730
 
1729
- #### `ai.parse` — Parse Document — legacy
1731
+ #### `ai.parse` — Parse Document v1
1730
1732
 
1731
- Extract text from documents (PDF, DOCX, images) using native extraction, OCR, or vision models
1733
+ Parse Document v1, the retired parser, kept only so existing workflows run unchanged. Do not add it to workflows: use ai.parse-v2 (Parse Document), which picks native text, OCR or vision per page.
1732
1734
 
1733
1735
  **Behavior and examples:** `eigenpal docs read steps/ai/parse`
1734
1736
 
@@ -6992,6 +6994,157 @@ Output schema:
6992
6994
  ```
6993
6995
 
6994
6996
 
6997
+ #### `transform.merge-documents` — Merge Documents
6998
+
6999
+ Concatenate several files into one PDF run output, in order. Accepts PDFs, images (multi-page TIFF included) and Word, PowerPoint, OpenDocument or RTF documents. Use it when one logical document arrives as several uploads: pass {{ steps.merge.output.file }} into Parse so page labels, page ranges and vision page indices stay continuous across every source. Output sources[] maps each input file to its merged page range.
7000
+
7001
+ **Behavior and examples:** `eigenpal docs read steps/transform/merge-documents`
7002
+
7003
+ **Durable retry:** Transforms, including those that write files, are not durably retried.
7004
+
7005
+ **Config** (in `step.with`):
7006
+
7007
+ | Field | Type | Required | Default | Description |
7008
+ | --- | --- | --- | --- | --- |
7009
+ | `files` | string | yes | | Template expression resolving to the files to merge, in order: a file list input such as {{ input.documents }}, or a single file. PDF, images (JPEG, PNG, TIFF, WebP, GIF) and Word, PowerPoint, OpenDocument or RTF documents. |
7010
+ | `filename` | string | no | | Filename of the merged PDF. Defaults to merged.pdf; .pdf is appended when missing. |
7011
+
7012
+ **Output:** `object`
7013
+
7014
+ | Field | Type | Required | Default | Description |
7015
+ | --- | --- | --- | --- | --- |
7016
+ | `file` | object | yes | | The merged PDF. Pass {{ steps.<step>.output.file }} to Parse, Vision or any other file input. |
7017
+ | `pageCount` | integer | yes | | Total pages in the merged PDF |
7018
+ | `sources` | array<object> | yes | | One entry per input file, in merge order, with the merged page range it occupies. Use it to map a merged page index back to its source file. |
7019
+
7020
+ ##### Complete machine-readable schemas
7021
+
7022
+ Config schema:
7023
+
7024
+ ```json
7025
+ {
7026
+ "$schema": "http://json-schema.org/draft-07/schema#",
7027
+ "type": "object",
7028
+ "properties": {
7029
+ "files": {
7030
+ "type": "string",
7031
+ "minLength": 1,
7032
+ "description": "Template expression resolving to the files to merge, in order: a file list input such as {{ input.documents }}, or a single file. PDF, images (JPEG, PNG, TIFF, WebP, GIF) and Word, PowerPoint, OpenDocument or RTF documents."
7033
+ },
7034
+ "filename": {
7035
+ "description": "Filename of the merged PDF. Defaults to merged.pdf; .pdf is appended when missing.",
7036
+ "type": "string"
7037
+ }
7038
+ },
7039
+ "required": [
7040
+ "files"
7041
+ ],
7042
+ "additionalProperties": false
7043
+ }
7044
+ ```
7045
+
7046
+
7047
+ Output schema:
7048
+
7049
+ ```json
7050
+ {
7051
+ "$schema": "http://json-schema.org/draft-07/schema#",
7052
+ "type": "object",
7053
+ "properties": {
7054
+ "file": {
7055
+ "type": "object",
7056
+ "properties": {
7057
+ "fileId": {
7058
+ "type": "string",
7059
+ "description": "File ID of the merged PDF"
7060
+ },
7061
+ "filename": {
7062
+ "type": "string",
7063
+ "description": "Filename of the merged PDF"
7064
+ },
7065
+ "mimeType": {
7066
+ "type": "string",
7067
+ "description": "Always application/pdf"
7068
+ },
7069
+ "size": {
7070
+ "type": "integer",
7071
+ "minimum": 0,
7072
+ "maximum": 9007199254740991,
7073
+ "description": "Size of the merged PDF in bytes"
7074
+ }
7075
+ },
7076
+ "required": [
7077
+ "fileId",
7078
+ "filename",
7079
+ "mimeType",
7080
+ "size"
7081
+ ],
7082
+ "additionalProperties": false,
7083
+ "description": "The merged PDF. Pass {{ steps.<step>.output.file }} to Parse, Vision or any other file input."
7084
+ },
7085
+ "pageCount": {
7086
+ "type": "integer",
7087
+ "minimum": 0,
7088
+ "maximum": 9007199254740991,
7089
+ "description": "Total pages in the merged PDF"
7090
+ },
7091
+ "sources": {
7092
+ "type": "array",
7093
+ "items": {
7094
+ "type": "object",
7095
+ "properties": {
7096
+ "filename": {
7097
+ "type": "string",
7098
+ "description": "Filename of the source file"
7099
+ },
7100
+ "mimeType": {
7101
+ "type": "string",
7102
+ "description": "MIME type of the source file"
7103
+ },
7104
+ "pageCount": {
7105
+ "type": "integer",
7106
+ "minimum": 0,
7107
+ "maximum": 9007199254740991,
7108
+ "description": "Pages this source contributed"
7109
+ },
7110
+ "pageRange": {
7111
+ "type": "array",
7112
+ "items": [
7113
+ {
7114
+ "type": "integer",
7115
+ "minimum": -9007199254740991,
7116
+ "maximum": 9007199254740991
7117
+ },
7118
+ {
7119
+ "type": "integer",
7120
+ "minimum": -9007199254740991,
7121
+ "maximum": 9007199254740991
7122
+ }
7123
+ ],
7124
+ "description": "[startIndex, endIndex] inclusive, 0-based page indices in the merged PDF"
7125
+ }
7126
+ },
7127
+ "required": [
7128
+ "filename",
7129
+ "mimeType",
7130
+ "pageCount",
7131
+ "pageRange"
7132
+ ],
7133
+ "additionalProperties": false
7134
+ },
7135
+ "description": "One entry per input file, in merge order, with the merged page range it occupies. Use it to map a merged page index back to its source file."
7136
+ }
7137
+ },
7138
+ "required": [
7139
+ "file",
7140
+ "pageCount",
7141
+ "sources"
7142
+ ],
7143
+ "additionalProperties": false
7144
+ }
7145
+ ```
7146
+
7147
+
6995
7148
  ### Action steps — external side effects
6996
7149
 
6997
7150
  #### `action.http` — HTTP Request
@@ -7143,8 +7296,8 @@ Execute another workflow and return its output
7143
7296
  | `execution` | `"inline"` \| `"child"` | no | | inline: run target steps in this execution (default). child: spawn a separate run with lineage. |
7144
7297
  | `input` | record<string, unknown> | no | | Input record keyed by the invoked workflow's declared inputs |
7145
7298
  | `wait` | boolean | no | | Child mode only. Wait for the invoked workflow to complete and return its output (default: true). Set false for fire-and-forget. |
7146
- | `timeout` | number | no | | Child mode only. Max wait time in ms while the child is queued or running (default: 300000). Once the child pauses for human review, the parent pauses durably instead of using this timeout. |
7147
- | `pollInterval` | number | no | | Child mode only. How often to poll status in ms when waiting (default: 1000) |
7299
+ | `timeout` | number | no | | Child mode only. Max wait time in ms while the child is queued or running (default: 300000). The deadline is stored with the invocation and survives worker restarts; expiry makes the parent eligible to resume and report the timeout. Once the child pauses for human review, the parent pauses durably instead of using this timeout. |
7300
+ | `pollInterval` | number | no | | Child mode only. Accepted for compatibility. Durable child waits no longer poll or occupy a worker slot. |
7148
7301
 
7149
7302
  **Output:** `record<string, unknown>`
7150
7303
 
@@ -7207,11 +7360,11 @@ Config schema:
7207
7360
  "type": "boolean"
7208
7361
  },
7209
7362
  "timeout": {
7210
- "description": "Child mode only. Max wait time in ms while the child is queued or running (default: 300000). Once the child pauses for human review, the parent pauses durably instead of using this timeout.",
7363
+ "description": "Child mode only. Max wait time in ms while the child is queued or running (default: 300000). The deadline is stored with the invocation and survives worker restarts; expiry makes the parent eligible to resume and report the timeout. Once the child pauses for human review, the parent pauses durably instead of using this timeout.",
7211
7364
  "type": "number"
7212
7365
  },
7213
7366
  "pollInterval": {
7214
- "description": "Child mode only. How often to poll status in ms when waiting (default: 1000)",
7367
+ "description": "Child mode only. Accepted for compatibility. Durable child waits no longer poll or occupy a worker slot.",
7215
7368
  "type": "number"
7216
7369
  }
7217
7370
  },
@@ -377,7 +377,7 @@ Description-writing tips (mirrors Reducto's guidance):
377
377
 
378
378
  ```yaml
379
379
  - name: parse
380
- type: ai.parse
380
+ type: ai.parse-v2
381
381
  with:
382
382
  input: '{{ input.document }}'
383
383
 
@@ -1122,7 +1122,8 @@ This JSON Schema is generated from the same Zod schema used to parse workflow YA
1122
1122
  "transform.text-chunker",
1123
1123
  "transform.regex-extract",
1124
1124
  "transform.archive-list",
1125
- "transform.archive-extract"
1125
+ "transform.archive-extract",
1126
+ "transform.merge-documents"
1126
1127
  ]
1127
1128
  },
1128
1129
  "name": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eigenpal/cli",
3
- "version": "0.20.40",
3
+ "version": "0.20.42",
4
4
  "description": "Eigenpal CLI — author and run document workflows from your terminal. Agent-ready.",
5
5
  "keywords": [
6
6
  "eigenpal",
@@ -50,7 +50,7 @@
50
50
  "generate:cli-docs:check": "bun scripts/generate-cli-docs.ts --check",
51
51
  "generate:logo": "bun scripts/render-logo-ascii.ts --cells 20",
52
52
  "test": "bun test src/ scripts/",
53
- "typecheck": "tsc --noEmit"
53
+ "typecheck": "bun check"
54
54
  },
55
55
  "dependencies": {},
56
56
  "devDependencies": {