@superglue/cli 1.1.32 → 1.1.33
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/.claude-plugin/plugin.json +1 -1
- package/README.md +3 -3
- package/dist/cli.js +182 -368
- package/dist/skills/superglue/SKILL.md +15 -15
- package/dist/skills/superglue/references/file-handling.md +9 -6
- package/dist/skills/superglue/references/http.md +15 -4
- package/dist/skills/superglue/references/mongodb.md +2 -2
- package/dist/skills/superglue/references/mssql.md +22 -22
- package/dist/skills/superglue/references/odbc.md +2 -2
- package/dist/skills/superglue/references/postgres.md +2 -2
- package/dist/skills/superglue/references/redis.md +2 -2
- package/dist/skills/superglue/references/sftp-smb.md +5 -5
- package/dist/skills/superglue/references/superglue-info.md +6 -6
- package/package.json +1 -1
- package/skills/superglue/SKILL.md +15 -15
- package/skills/superglue/references/file-handling.md +9 -6
- package/skills/superglue/references/http.md +15 -4
- package/skills/superglue/references/mongodb.md +2 -2
- package/skills/superglue/references/mssql.md +22 -22
- package/skills/superglue/references/odbc.md +2 -2
- package/skills/superglue/references/postgres.md +2 -2
- package/skills/superglue/references/redis.md +2 -2
- package/skills/superglue/references/sftp-smb.md +5 -5
- package/skills/superglue/references/superglue-info.md +6 -6
|
@@ -54,7 +54,7 @@ Read these on demand — they are authoritative for their topic and kept in sync
|
|
|
54
54
|
|
|
55
55
|
**Non-interactive environments (AI agents, CI)**
|
|
56
56
|
|
|
57
|
-
- Pass
|
|
57
|
+
- Pass all secret values directly via `--credentials '{"api_key":"sk-xxx"}'`. Ask the user for secret values, then include them in the JSON.
|
|
58
58
|
|
|
59
59
|
---
|
|
60
60
|
|
|
@@ -124,7 +124,7 @@ Blocked commands print a clear error showing the current preset and how to chang
|
|
|
124
124
|
### Building a Tool
|
|
125
125
|
|
|
126
126
|
1. **Load relevant protocol references** via `sg skill <topic>` based on the systems involved (http, postgres, graphql, etc.)
|
|
127
|
-
2. Use `sg system find` for every involved system — note
|
|
127
|
+
2. Use `sg system find` for every involved system — note the available secret names and the system URL
|
|
128
128
|
3. Use `sg system search-docs` for each system — look up endpoints, auth patterns, pagination, response structure
|
|
129
129
|
4. Use `sg system call` to test 1-2 primary endpoints — verify response structure and field names before building
|
|
130
130
|
5. Call `sg tool build --config '{...}'` with the full tool config (see Reference → Tool Config Schema)
|
|
@@ -145,7 +145,7 @@ Blocked commands print a clear error showing the current preset and how to chang
|
|
|
145
145
|
1. Search for an existing system first: `sg system find <query>`
|
|
146
146
|
2. If creating: `sg system create --name "..." --url "..." --credentials '{...}'`. Prefer `--template <id>` when one exists — it auto-fills URL and OAuth config
|
|
147
147
|
3. For OAuth: `sg system oauth --system-id <id> [--scopes "..."]` opens a browser flow. User approves → tokens saved automatically
|
|
148
|
-
4. For non-OAuth
|
|
148
|
+
4. For non-OAuth secrets: `sg system credentials set --system-id <id> --credentials '{...}'`
|
|
149
149
|
5. Verify connectivity with `sg system call`
|
|
150
150
|
6. For updates: `sg system edit --id <id>` with the fields to change
|
|
151
151
|
|
|
@@ -219,7 +219,7 @@ Agents familiar with the web tool names can map them directly to CLI commands:
|
|
|
219
219
|
| `run_command` with `vfs` for `/org/tools/` | `sg tool find --id <id>` / `sg tool find <q>` | Full config with `--id`, compact search with a query string |
|
|
220
220
|
| `create_system` | `sg system create --name "..." --url "..."` | Use `--template <id>` when available |
|
|
221
221
|
| `edit_system` | `sg system edit --id <id> ...` | Supports `--env dev\|prod` |
|
|
222
|
-
| `run_command` with `vfs` for `/org/systems/` | `sg system find <query>` / `--id <id>` | Returns
|
|
222
|
+
| `run_command` with `vfs` for `/org/systems/` | `sg system find <query>` / `--id <id>` | Returns secret-key presence and the system URL |
|
|
223
223
|
| Credentials VFS / saved credentials | `sg system credentials get/set/clear` | Manage the current user's credentials for a system |
|
|
224
224
|
| `call_system` | `sg system call --url "..." --system-id <id>` | Authenticated ad-hoc calls for testing / schema introspection |
|
|
225
225
|
| `run_command search` | `sg system search-docs --system-id <id> -k` | Targeted keyword search over ingested system docs |
|
|
@@ -378,7 +378,8 @@ All step config fields (url, headers, body, queryParams) support `<<expression>>
|
|
|
378
378
|
<<page>> <<offset>> <<cursor>> <<limit>> <<pageSize>> pagination variables
|
|
379
379
|
<<systemId_api_key>> system credentials (namespaced: systemId_credKey)
|
|
380
380
|
<<systemId_url>> system base URLs (namespaced: systemId_url)
|
|
381
|
-
<<sg_auth_email>> email of the
|
|
381
|
+
<<sg_auth_email>> email of the user triggering this run (in scheduled runs: the schedule creator)
|
|
382
|
+
<<sg_auth_jwt>> short-lived signed JWT proving the identity of the user triggering this run; receivers verify it against superglue's outbound JWKS endpoint (/api/auth/outbound-jwks on the web app origin)
|
|
382
383
|
```
|
|
383
384
|
|
|
384
385
|
Simple `<<varName>>` only works for top-level keys. No dots, no nesting. `<<currentItem.id>>`, `<<sourceData.userId>>`, `<<user.name>>` all FAIL at runtime.
|
|
@@ -423,7 +424,7 @@ sourceData = {
|
|
|
423
424
|
|
|
424
425
|
Everything in `sourceData` shares ONE flat namespace. Saving a tool rejects payload input keys and step ids that collide with it:
|
|
425
426
|
|
|
426
|
-
- `__files__`, `currentItem`, `sg_auth_email` — injected by the runtime
|
|
427
|
+
- `__files__`, `currentItem`, `sg_auth_email`, `sg_auth_jwt` — injected by the runtime
|
|
427
428
|
- `page`, `offset`, `cursor`, `limit`, `pageSize` — rejected only when the tool has a paginated step, because they would shadow the live pagination counters; on non-paginated tools they are allowed but discouraged (a later edit that adds pagination will force a rename)
|
|
428
429
|
- the tool's own step ids — the step result overwrites a same-named payload key
|
|
429
430
|
- anything starting with `<systemId>_` for a system the tool uses — the entire prefix is reserved for namespaced credentials (`<systemId>_<credKey>`, `<systemId>_url`), even names that don't match an existing credential, because credentials added to the system later would silently shadow the input
|
|
@@ -491,10 +492,10 @@ All user-provided JS runs in an isolated Deno sandbox.
|
|
|
491
492
|
|
|
492
493
|
### Credentials and Systems
|
|
493
494
|
|
|
494
|
-
|
|
495
|
+
Secrets are referenced by name as `<<systemId_credentialKey>>` and resolved from the selected credential at execution time. You MUST explicitly reference them:
|
|
495
496
|
|
|
496
497
|
```
|
|
497
|
-
System id="stripe",
|
|
498
|
+
System id="stripe", selected credential has secret named: api_key
|
|
498
499
|
→ Available as: <<stripe_api_key>>
|
|
499
500
|
```
|
|
500
501
|
|
|
@@ -517,11 +518,11 @@ Basic auth auto-encodes: if the value after `Basic ` isn't already base64, the e
|
|
|
517
518
|
|
|
518
519
|
**Credential lifecycle:**
|
|
519
520
|
|
|
520
|
-
- Pass
|
|
521
|
-
- Use `sg system credentials set --system-id <id> --credentials '{...}'` to save
|
|
522
|
-
- Use `sg system credentials get --system-id <id>` to inspect current
|
|
521
|
+
- Pass all secret values via `--credentials '{"api_key":"...","client_secret":"..."}'` on create/edit
|
|
522
|
+
- Use `sg system credentials set --system-id <id> --credentials '{...}'` to save secrets in the current API-key user's credential
|
|
523
|
+
- Use `sg system credentials get --system-id <id>` to inspect the current user's secret names and whether each has a non-empty value; secret values are never returned
|
|
523
524
|
- OAuth tokens (`access_token`, `refresh_token`) auto-refresh before each step execution
|
|
524
|
-
- Non-sensitive fields (`client_id`, `auth_url`, `token_url`)
|
|
525
|
+
- Non-sensitive fields (`client_id`, `auth_url`, `token_url`) can be submitted alongside secrets in the same `--credentials` JSON
|
|
525
526
|
|
|
526
527
|
**System IDs:** lowercase letters, numbers, underscores only — no hyphens. Used for credential namespacing.
|
|
527
528
|
|
|
@@ -623,7 +624,6 @@ curl -X POST "https://api.superglue.cloud/v1/hooks/{toolId}?token=$SUPERGLUE_API
|
|
|
623
624
|
- **Double-encoded JSON** — when the body contains nested/stringified JSON (e.g. LLM APIs), have `<<>>` expressions return a string via `JSON.stringify(...)`, and use a single expression for the whole body rather than mixing `<<>>` with static JSON
|
|
624
625
|
- **POST for read-only ops** — GraphQL queries via POST should have `modify: false`. Don't rely on HTTP method alone
|
|
625
626
|
- **Saving without approval** — always present `sg tool run` results and ask before `sg tool save`
|
|
626
|
-
- **`sg_auth_email` in scheduled runs** — not available in scheduler-triggered executions. Tools using `<<sg_auth_email>>` will fail
|
|
627
627
|
- **Reserved key collisions** — payload inputs or step ids named after reserved/injected keys (see Naming Rules) are rejected at save time; pick a different name instead of retrying
|
|
628
628
|
|
|
629
629
|
---
|
|
@@ -640,14 +640,14 @@ For protocol-specific error recovery (HTTP, Postgres, MSSQL, Redis, MongoDB, Gra
|
|
|
640
640
|
|
|
641
641
|
1. Re-run with `--include-step-results` to see raw per-step responses and `data` fields
|
|
642
642
|
2. Use `sg system call` to test the failing endpoint directly — isolates step config vs system/auth issues
|
|
643
|
-
3. Use `sg system find --id <systemId>` to verify
|
|
643
|
+
3. Use `sg system find --id <systemId>` to verify the stored secret names match what the step references
|
|
644
644
|
4. For HTTP: run `sg skill http` and follow the error recovery section (endpoint vs system isolation, credential scopes, rate limiting)
|
|
645
645
|
5. For databases: run `sg skill postgres` or `sg skill mssql` — SSL/TLS and schema issues are common causes
|
|
646
646
|
6. Use `sg system search-docs` and web search to verify the current API shape. APIs change across versions
|
|
647
647
|
|
|
648
648
|
### Authentication failures
|
|
649
649
|
|
|
650
|
-
1. Run `sg system find --id <systemId>` → check
|
|
650
|
+
1. Run `sg system find --id <systemId>` → check which secret names are present and whether they have non-empty values
|
|
651
651
|
2. For OAuth: re-run `sg system oauth` if tokens are missing or expired
|
|
652
652
|
3. For custom OAuth: verify `client_id`, `client_secret`, `auth_url`, `token_url` are all present. Confirm the redirect URI is registered on the provider's OAuth app
|
|
653
653
|
4. Check scopes — 403 / empty responses often mean the token lacks required scopes
|
|
@@ -44,7 +44,7 @@ N/A — file handling is a runtime behavior, not a protocol. Authentication is h
|
|
|
44
44
|
|
|
45
45
|
Every response is read as raw bytes. The runtime classifies it using this priority chain:
|
|
46
46
|
|
|
47
|
-
1. **Magic-byte detection** — known binary signatures (ZIP `PK\x03\x04`, PDF `%PDF`, GZIP `\x1f\x8b`, plus internal ZIP structure checks for Excel/DOCX)
|
|
47
|
+
1. **Magic-byte detection** — known binary signatures (ZIP `PK\x03\x04`, PDF `%PDF`, GZIP `\x1f\x8b`, plus internal ZIP structure checks for Excel/DOCX/PPTX)
|
|
48
48
|
2. **`Content-Disposition: attachment`** — `attachment` or `filename=` in this header forces file treatment
|
|
49
49
|
3. **`application/octet-stream`** — explicit octet-stream MIME catches unlabeled binary payloads
|
|
50
50
|
4. **25MB size fallback** — only when byte detection returned `RAW`, the response exceeds 25MB, and `Content-Type` is not text-like (`text/*`, `application/json`, `*+json`, `application/xml`)
|
|
@@ -53,11 +53,11 @@ File server `get` operations always produce files regardless of detected type.
|
|
|
53
53
|
|
|
54
54
|
### Classification
|
|
55
55
|
|
|
56
|
-
| Classification | Types
|
|
57
|
-
| ------------------- |
|
|
58
|
-
| **Binary** | PDF, Excel, DOCX, ZIP, GZIP | `producedFiles` + `data` (extracted/parsed content) |
|
|
59
|
-
| **Structured text** | JSON, XML, CSV, YAML, HTML
|
|
60
|
-
| **RAW** | Unrecognized
|
|
56
|
+
| Classification | Types | Destination |
|
|
57
|
+
| ------------------- | --------------------------------- | -------------------------------------------------------------- |
|
|
58
|
+
| **Binary** | PDF, Excel, DOCX, PPTX, ZIP, GZIP | `producedFiles` + `data` (extracted/parsed content) |
|
|
59
|
+
| **Structured text** | JSON, XML, CSV, YAML, HTML | `data` only (parsed to JS objects) |
|
|
60
|
+
| **RAW** | Unrecognized | File if attachment/octet-stream/25MB fallback, else raw string |
|
|
61
61
|
|
|
62
62
|
Binary responses expose `stepFileKeys` and populate `sourceData.__files__`. Structured text responses only populate `sourceData.stepId.data`.
|
|
63
63
|
|
|
@@ -73,10 +73,13 @@ Binary responses expose `stepFileKeys` and populate `sourceData.__files__`. Stru
|
|
|
73
73
|
| Excel | Object keyed by sheet name, each value is array of row objects |
|
|
74
74
|
| PDF | `{ textContent, structuredContent: [{ page, text }] }` |
|
|
75
75
|
| DOCX | Markdown string |
|
|
76
|
+
| PPTX | Plain text, separated by slide |
|
|
76
77
|
| ZIP | Object keyed by entry filename, each value recursively parsed |
|
|
77
78
|
| GZIP | Recursively parsed inner content |
|
|
78
79
|
| RAW | UTF-8 string fallback |
|
|
79
80
|
|
|
81
|
+
**PPTX rules:** extraction includes slide text, including text inside basic tables. It does not include images, charts, layout, animations, or speaker notes.
|
|
82
|
+
|
|
80
83
|
**Excel rules:**
|
|
81
84
|
|
|
82
85
|
- Excel is never a flat array. It is always `{ "SheetName": [ {row}, ... ] }` — even for single-sheet files
|
|
@@ -68,8 +68,15 @@ Some APIs (e.g. Salesforce) use SOAP XML login where credentials are embedded in
|
|
|
68
68
|
|
|
69
69
|
`<<systemId_password>><<systemId_security_token>>` resolves to the password and token concatenated — no separator needed. This works in URL, headers, and body fields.
|
|
70
70
|
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
### Parsing XML responses
|
|
72
|
+
|
|
73
|
+
XML responses (SOAP and other XML APIs) are auto-parsed to an object on `sourceData.stepId.data`. The parser has quirks you MUST account for in transforms and stopConditions — probe the real response with a small page before writing selectors:
|
|
74
|
+
|
|
75
|
+
- **Every tag name is UPPERCASED.** `<response><record>` becomes `RESPONSE.RECORD`, regardless of the source casing. Always select uppercase keys.
|
|
76
|
+
- **Single vs multiple children collapse.** One child element parses to an object; multiple with the same tag parse to an array. Normalize before mapping: `const rows = Array.isArray(x) ? x : (x ? [x] : [])`.
|
|
77
|
+
- **Element attributes become keys on the element object** (also uppercased). `<data count="2" total="127">` gives `DATA.COUNT` and `DATA.TOTAL` alongside the child records.
|
|
78
|
+
- **Text with attributes goes to `_TEXT`.** An element with both attributes and text content stores the text under a `_TEXT` key. Empty elements (`<field></field>`) become `{}`.
|
|
79
|
+
- **Numbers and booleans are strings.** Everything is a string; wrap with `Number(...)` where you need arithmetic.
|
|
73
80
|
|
|
74
81
|
## HTTP Runtime Details
|
|
75
82
|
|
|
@@ -143,11 +150,15 @@ Multipart restrictions:
|
|
|
143
150
|
|
|
144
151
|
All HTTP responses are read as raw bytes, then classified by byte-level detection (see `file-handling.md` for the full detection logic).
|
|
145
152
|
|
|
146
|
-
- **
|
|
153
|
+
- **File responses**: formats classified as files by `file-handling.md` are stored as files, and parsed content populates `data` when extraction is available. Later steps can reference them via `file::<stepId>.raw/base64/extracted`.
|
|
147
154
|
- **`application/octet-stream`**: always treated as a file.
|
|
148
155
|
- **Responses over 25 MB**: treated as files as a safety fallback.
|
|
149
156
|
- **RAW + `Content-Disposition: attachment`**: treated as a file.
|
|
150
|
-
- **
|
|
157
|
+
- **Inline responses**: formats classified as structured or plain text by `file-handling.md` populate `data` without producing a stored file unless another file rule applies.
|
|
158
|
+
|
|
159
|
+
### XML Response Casing
|
|
160
|
+
|
|
161
|
+
XML responses are parsed into a JSON tree with ALL tag names normalized to UPPERCASE — the parsed keys will not match the raw document's casing. This applies identically to `sg system call` and to request steps in tools. A raw `fetch()` inside a transform step is the exception: it returns the original document with its real casing (often lowercase envelope tags with uppercase field tags). Never write string-level XML parsing logic in a transform from memory of what `sg system call` showed — capture a raw probe first (e.g. return `{ rawXml: xml.slice(0, 1500) }`), and guard against self-closing empty containers (`<data/>` has no closing tag) and repeated sibling result blocks.
|
|
151
162
|
|
|
152
163
|
### Error Detection
|
|
153
164
|
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
}
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
Configure the connection URL based on
|
|
14
|
+
Configure the connection URL based on the selected credential's secrets — use `sg system find` to inspect the available secret names and reference them accordingly.
|
|
15
15
|
|
|
16
16
|
`method`, `headers`, `queryParams`, and `pagination` are HTTP-only fields — omit them for MongoDB steps.
|
|
17
17
|
|
|
@@ -130,7 +130,7 @@ Default retries come from server config. On final failure, the error includes th
|
|
|
130
130
|
When a MongoDB step fails:
|
|
131
131
|
|
|
132
132
|
1. **Read the error message** — superglue includes the operation name in the error. Check for unknown operations, missing required fields (`filter`, `update`, `pipeline`), or malformed Extended JSON.
|
|
133
|
-
2. **Verify connection
|
|
133
|
+
2. **Verify connection secrets** — use `sg system find` to confirm the stored secret names match the placeholders in your URL. Test with a `listCollections` operation via `sg system call`.
|
|
134
134
|
3. **Check auth source** — "Authentication failed" usually means a missing or wrong `authSource`. Root users authenticate against `admin`.
|
|
135
135
|
4. **Check connectivity** — connection refused or server-selection timeouts mean the host is unreachable, the SRV record can't resolve, or an IP allowlist (Atlas) is blocking you. `mongodb+srv://` requires outbound DNS.
|
|
136
136
|
5. **Check the operation shape** — read operations (`find`, `countDocuments`, `distinct`) never mutate; write operations require their specific fields. `aggregate` is read-only unless its pipeline contains a `$out` or `$merge` stage, which writes results back to a collection. Confirm `filter`/`update`/`pipeline` are objects/arrays, not strings.
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
}
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
Configure the connection URL based on
|
|
16
|
+
Configure the connection URL based on the selected credential's secrets — use `sg system find` to inspect the available secret names and reference them accordingly.
|
|
17
17
|
|
|
18
18
|
`method`, `headers`, `queryParams`, and `pagination` are HTTP-only fields — omit them for database steps.
|
|
19
19
|
|
|
@@ -93,46 +93,46 @@ mssql://<<my_db_user>>:<<my_db_password>>@<<my_db_host>>:<<my_db_port>>/<<my_db_
|
|
|
93
93
|
|
|
94
94
|
### Windows Authentication (NTLM)
|
|
95
95
|
|
|
96
|
-
For on-prem SQL Servers that only accept Windows domain logins (no SQL auth),
|
|
96
|
+
For on-prem SQL Servers that only accept Windows domain logins (no SQL auth), add secrets with these names to the credential:
|
|
97
97
|
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
| `authType`
|
|
101
|
-
| `domain`
|
|
102
|
-
| `user`
|
|
103
|
-
| `password`
|
|
98
|
+
| Secret Name | Required | Notes |
|
|
99
|
+
| ----------- | -------- | ----------------------------------------------------- |
|
|
100
|
+
| `authType` | yes | `ntlm` |
|
|
101
|
+
| `domain` | yes | Windows domain (e.g. `CORP`) |
|
|
102
|
+
| `user` | yes | Windows username (also accepts `username`, or in URL) |
|
|
103
|
+
| `password` | yes | Windows password (or in URL) |
|
|
104
104
|
|
|
105
105
|
```
|
|
106
106
|
URL: mssql://<<sys_user>>:<<sys_password>>@<<sys_host>>:<<sys_port>>/<<sys_database>>
|
|
107
|
-
|
|
107
|
+
Secrets: { authType: "ntlm", domain, user, password, host, port, database }
|
|
108
108
|
```
|
|
109
109
|
|
|
110
110
|
Alternatively, pass the domain as a `?domain=CORP` query parameter on the URL — any URL with a `domain` set authenticates via NTLM. Kerberos-only environments are not supported; ask the DBA to permit NTLM or create a SQL login.
|
|
111
111
|
|
|
112
112
|
### Azure Active Directory Authentication
|
|
113
113
|
|
|
114
|
-
For Azure AD auth,
|
|
114
|
+
For Azure AD auth, add secrets with the following names to the credential alongside the standard connection fields:
|
|
115
115
|
|
|
116
116
|
**Entra ID User + Password** — authenticates as an Azure AD user. Requires an Azure app registration.
|
|
117
117
|
|
|
118
|
-
|
|
|
119
|
-
|
|
|
120
|
-
| `authType`
|
|
121
|
-
| `clientId`
|
|
122
|
-
| `tenantId`
|
|
123
|
-
| `user`
|
|
124
|
-
| `password`
|
|
118
|
+
| Secret Name | Required | Notes |
|
|
119
|
+
| ----------- | -------- | ------------------------------------------------------ |
|
|
120
|
+
| `authType` | yes | `azure-active-directory-password` |
|
|
121
|
+
| `clientId` | yes | Application (client) ID from Azure app registration |
|
|
122
|
+
| `tenantId` | no | Directory (tenant) ID |
|
|
123
|
+
| `user` | yes | Azure AD username (also accepts `username`, or in URL) |
|
|
124
|
+
| `password` | yes | Azure AD password (or in URL) |
|
|
125
125
|
|
|
126
|
-
`user` and `password` can be stored as
|
|
126
|
+
`user` and `password` can be stored as secrets or embedded in the URL — values resolved into the URL take precedence; stored secrets only fill gaps the URL omits.
|
|
127
127
|
|
|
128
128
|
```
|
|
129
129
|
URL: mssql://<<sys_user>>:<<sys_password>>@myserver.database.windows.net:1433/mydb
|
|
130
|
-
|
|
130
|
+
Secrets: { authType, clientId, tenantId, user, password, host, port, database }
|
|
131
131
|
```
|
|
132
132
|
|
|
133
133
|
**Service Principal** — authenticates as an Azure AD application. No user/password needed in the URL.
|
|
134
134
|
|
|
135
|
-
|
|
|
135
|
+
| Secret Name | Required | Notes |
|
|
136
136
|
| -------------- | -------- | ------------------------------------------------- |
|
|
137
137
|
| `authType` | yes | `azure-active-directory-service-principal-secret` |
|
|
138
138
|
| `clientId` | yes | Application (client) ID |
|
|
@@ -141,7 +141,7 @@ Credentials: { authType, clientId, tenantId, user, password, host, port, databas
|
|
|
141
141
|
|
|
142
142
|
```
|
|
143
143
|
URL: mssql://myserver.database.windows.net:1433/mydb
|
|
144
|
-
|
|
144
|
+
Secrets: { authType, clientId, clientSecret, tenantId, host, port, database }
|
|
145
145
|
```
|
|
146
146
|
|
|
147
147
|
The runtime authenticates entirely via the service principal credentials — no user or password is needed in the URL.
|
|
@@ -245,7 +245,7 @@ Default retries from server config. On final failure, error includes query text
|
|
|
245
245
|
When an MSSQL step fails and the cause is not obvious:
|
|
246
246
|
|
|
247
247
|
1. **Read the error message** — superglue includes the query text and params in the error. Check for syntax errors, missing columns, or type mismatches.
|
|
248
|
-
2. **Verify connection
|
|
248
|
+
2. **Verify connection secrets** — use `sg system find` to confirm the stored secret names match the placeholders in your URL. Test connectivity with a simple `SELECT 1` via `sg system call`.
|
|
249
249
|
3. **Check database-side access** — connection refused or permission denied errors typically mean the database user lacks access. Verify with the user that the credentials have the required grants.
|
|
250
250
|
4. **Check Azure-specific issues** — if connecting to Azure SQL:
|
|
251
251
|
- Confirm the client IP is allowed in the Azure SQL firewall rules
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
}
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
Configure the connection URL based on
|
|
14
|
+
Configure the connection URL based on the selected credential's secrets — use `sg system find` to inspect the available secret names and reference them accordingly.
|
|
15
15
|
|
|
16
16
|
`method`, `headers`, `queryParams`, and `pagination` are HTTP-only fields — omit them for database steps.
|
|
17
17
|
|
|
@@ -185,7 +185,7 @@ For other ODBC-backed databases, look up the database/driver-specific error code
|
|
|
185
185
|
When an ODBC step fails and the cause is not obvious:
|
|
186
186
|
|
|
187
187
|
1. **Read the error message** — superglue includes a truncated query preview in the error. Check for syntax errors, missing columns, or type mismatches.
|
|
188
|
-
2. **Verify connection
|
|
188
|
+
2. **Verify connection secrets** — use `sg system find` to confirm the stored secret names match the placeholders in your URL. Test connectivity with a simple `SELECT 1` via `sg system call`.
|
|
189
189
|
3. **Check database-side access** — connection refused or permission denied errors typically mean the database user lacks access. Verify with the user that the credentials have the required grants.
|
|
190
190
|
4. **Check driver availability** — if the error mentions "driver not found", the `DRIVER` query parameter does not match any registered driver in `/etc/odbcinst.ini`. Verify the driver name is correct and the driver is installed in the Docker image.
|
|
191
191
|
5. **Test the query directly** — use `sg system call` with a simplified version of the query to isolate whether the issue is the query itself, the parameters, or the connection.
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
}
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
Configure the connection URL based on
|
|
14
|
+
Configure the connection URL based on the selected credential's secrets — use `sg system find` to inspect the available secret names and reference them accordingly.
|
|
15
15
|
|
|
16
16
|
`method`, `headers`, `queryParams`, and `pagination` are HTTP-only fields — omit them for database steps.
|
|
17
17
|
|
|
@@ -148,7 +148,7 @@ Default retries from server config. On final failure, error includes query text
|
|
|
148
148
|
When a PostgreSQL step fails and the cause is not obvious:
|
|
149
149
|
|
|
150
150
|
1. **Read the error message** — superglue includes the query text and params in the error. Check for syntax errors, missing columns, or type mismatches.
|
|
151
|
-
2. **Verify connection
|
|
151
|
+
2. **Verify connection secrets** — use `sg system find` to confirm the stored secret names match the placeholders in your URL. Test connectivity with a simple `SELECT 1` via `sg system call`.
|
|
152
152
|
3. **Check database-side access** — connection refused or permission denied errors typically mean the database user lacks access to the database, schema, or table. Verify with the user that the credentials have the required grants.
|
|
153
153
|
4. **Test the query directly** — use `sg system call` with a simplified version of the query to isolate whether the issue is the query itself, the parameters, or the connection.
|
|
154
154
|
5. **Check for SSL/TLS issues** — if the error mentions SSL or handshake failure, check the SSL / TLS section above. For non-localhost servers that don't support SSL, add `?sslmode=disable` to the URL. For servers that require SSL, add `?sslmode=require`.
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
}
|
|
12
12
|
```
|
|
13
13
|
|
|
14
|
-
Configure the connection URL based on
|
|
14
|
+
Configure the connection URL based on the selected credential's secrets — use `sg system find` to inspect the available secret names and reference them accordingly.
|
|
15
15
|
|
|
16
16
|
`method`, `headers`, `queryParams`, and `pagination` are HTTP-only fields — omit them for Redis steps.
|
|
17
17
|
|
|
@@ -133,7 +133,7 @@ Default retries from server config. On final failure, error includes command and
|
|
|
133
133
|
When a Redis step fails:
|
|
134
134
|
|
|
135
135
|
1. **Read the error message** — superglue includes the command and args in the error. Check for unknown commands, wrong argument counts, or type errors (e.g. running a list command on a string key).
|
|
136
|
-
2. **Verify connection
|
|
136
|
+
2. **Verify connection secrets** — use `sg system find` to confirm the stored secret names match the placeholders in your URL. Test with a simple `PING` command via `sg system call`.
|
|
137
137
|
3. **Check connectivity and access** — connection refused errors typically mean the Redis server is unreachable or requires TLS (`rediss://`). AUTH errors mean the password is wrong or the user lacks access.
|
|
138
138
|
4. **Check key types** — Redis commands are type-specific. Running `GET` on a hash key or `HGETALL` on a string key returns a `WRONGTYPE` error. Use `TYPE` command via `sg system call` to check a key's type before building.
|
|
139
139
|
5. **Verify TLS requirements** — if the error mentions connection reset or handshake failure, try switching between `redis://` and `rediss://`.
|
|
@@ -13,7 +13,7 @@ FTP, SFTP, and SMB share an identical operation interface. Only the URL protocol
|
|
|
13
13
|
}
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
-
Configure the connection URL based on
|
|
16
|
+
Configure the connection URL based on the selected credential's secrets — use `sg system find` to inspect the available secret names and reference them accordingly.
|
|
17
17
|
|
|
18
18
|
`method`, `headers`, `queryParams`, and `pagination` are HTTP-only fields — omit them for file server steps.
|
|
19
19
|
|
|
@@ -128,7 +128,7 @@ Single operation returns the result directly. Array of operations returns an arr
|
|
|
128
128
|
|
|
129
129
|
**FTP/FTPS:** uses `basic-ftp`. FTPS uses TLS with `rejectUnauthorized: false`. Connection timeout configurable.
|
|
130
130
|
|
|
131
|
-
**SMB:** uses `@tryjsky/v9u-smb2`. Connection lifecycle: create client (with share, domain, credentials), execute operations, disconnect.
|
|
131
|
+
**SMB:** uses `@tryjsky/v9u-smb2`. Connection lifecycle: create client (with share, domain, credentials), execute operations, disconnect.
|
|
132
132
|
|
|
133
133
|
### Retry Behavior
|
|
134
134
|
|
|
@@ -152,10 +152,10 @@ When the user wants to **download** a file fetched via SFTP/SMB/FTP, set `output
|
|
|
152
152
|
When a file server step fails and the cause is not obvious:
|
|
153
153
|
|
|
154
154
|
1. **Read the error message** — superglue includes the operations list in the error. Check for typos in paths, missing fields, or unsupported operations.
|
|
155
|
-
2. **Verify connection
|
|
155
|
+
2. **Verify connection secrets** — use `sg system find` to confirm the stored secret names match the placeholders in your URL. Test with a simple `list` operation on the base path via `sg system call`.
|
|
156
156
|
3. **Check path resolution** — if you get "file not found", verify the path is relative to the URL base path, not an absolute filesystem path. Use `list` on the parent directory to see what files exist.
|
|
157
157
|
4. **Check permissions** — permission denied errors mean the user account lacks read/write access to the target path. Verify with the user that the account has the required grants.
|
|
158
158
|
5. **Check protocol-specific issues:**
|
|
159
|
-
- **SFTP**: if the error mentions authentication, verify whether the server expects password or private key auth. If using private key, ensure `privateKey` and `passphrase` are stored as
|
|
159
|
+
- **SFTP**: if the error mentions authentication, verify whether the server expects password or private key auth. If using private key, ensure `privateKey` and `passphrase` are stored as secrets in the credential.
|
|
160
160
|
- **FTP/FTPS**: if the connection fails, try switching between `ftp://` and `ftps://` — some servers require TLS, others don't support it.
|
|
161
|
-
- **SMB**: verify the share name is correct (first path segment). If using domain auth, ensure the domain is included in the URL or stored as a
|
|
161
|
+
- **SMB**: verify the share name is correct (first path segment). If using domain auth, ensure the domain is included in the URL or stored as a secret. Check that the SMB port (445) is accessible.
|
|
@@ -7,13 +7,13 @@ superglue is an open-source, AI-native integration platform that builds and runs
|
|
|
7
7
|
Developed by superglue (Y Combinator W25), founded by Adina Görres and Stefan Faistenauer in 2025, based in Munich and San Francisco.
|
|
8
8
|
|
|
9
9
|
- Website: https://superglue.ai
|
|
10
|
-
- Documentation: https://
|
|
10
|
+
- Documentation: https://superglue.ai/docs/
|
|
11
11
|
- GitHub: https://github.com/superglue-ai/superglue
|
|
12
12
|
|
|
13
13
|
If the user is asking general questions (not building):
|
|
14
14
|
|
|
15
15
|
- Company/team/pricing → https://superglue.ai/
|
|
16
|
-
- Product/features → https://
|
|
16
|
+
- Product/features → https://superglue.ai/docs/getting-started/introduction/
|
|
17
17
|
- Open-source/code → https://github.com/superglue-ai/superglue
|
|
18
18
|
|
|
19
19
|
## Cloud Usage Tiers
|
|
@@ -35,10 +35,10 @@ Users can generate and manage API keys on the standalone **API Keys** page (`/ap
|
|
|
35
35
|
## Interfaces
|
|
36
36
|
|
|
37
37
|
- **Web app** — primary UI for building, testing, and managing tools and systems
|
|
38
|
-
- **TypeScript/Python SDK** — https://
|
|
39
|
-
- **REST API** — https://
|
|
40
|
-
- **MCP Server** — https://
|
|
41
|
-
- **CLI** — `npm install -g @superglue/cli` — https://
|
|
38
|
+
- **TypeScript/Python SDK** — https://superglue.ai/docs/sdk/overview/
|
|
39
|
+
- **REST API** — https://superglue.ai/docs/api/
|
|
40
|
+
- **MCP Server** — https://superglue.ai/docs/mcp/using-the-mcp/
|
|
41
|
+
- **CLI** — `npm install -g @superglue/cli` — https://superglue.ai/docs/getting-started/cli-skills/
|
|
42
42
|
|
|
43
43
|
### Webhook Triggers
|
|
44
44
|
|
package/package.json
CHANGED
|
@@ -54,7 +54,7 @@ Read these on demand — they are authoritative for their topic and kept in sync
|
|
|
54
54
|
|
|
55
55
|
**Non-interactive environments (AI agents, CI)**
|
|
56
56
|
|
|
57
|
-
- Pass
|
|
57
|
+
- Pass all secret values directly via `--credentials '{"api_key":"sk-xxx"}'`. Ask the user for secret values, then include them in the JSON.
|
|
58
58
|
|
|
59
59
|
---
|
|
60
60
|
|
|
@@ -124,7 +124,7 @@ Blocked commands print a clear error showing the current preset and how to chang
|
|
|
124
124
|
### Building a Tool
|
|
125
125
|
|
|
126
126
|
1. **Load relevant protocol references** via `sg skill <topic>` based on the systems involved (http, postgres, graphql, etc.)
|
|
127
|
-
2. Use `sg system find` for every involved system — note
|
|
127
|
+
2. Use `sg system find` for every involved system — note the available secret names and the system URL
|
|
128
128
|
3. Use `sg system search-docs` for each system — look up endpoints, auth patterns, pagination, response structure
|
|
129
129
|
4. Use `sg system call` to test 1-2 primary endpoints — verify response structure and field names before building
|
|
130
130
|
5. Call `sg tool build --config '{...}'` with the full tool config (see Reference → Tool Config Schema)
|
|
@@ -145,7 +145,7 @@ Blocked commands print a clear error showing the current preset and how to chang
|
|
|
145
145
|
1. Search for an existing system first: `sg system find <query>`
|
|
146
146
|
2. If creating: `sg system create --name "..." --url "..." --credentials '{...}'`. Prefer `--template <id>` when one exists — it auto-fills URL and OAuth config
|
|
147
147
|
3. For OAuth: `sg system oauth --system-id <id> [--scopes "..."]` opens a browser flow. User approves → tokens saved automatically
|
|
148
|
-
4. For non-OAuth
|
|
148
|
+
4. For non-OAuth secrets: `sg system credentials set --system-id <id> --credentials '{...}'`
|
|
149
149
|
5. Verify connectivity with `sg system call`
|
|
150
150
|
6. For updates: `sg system edit --id <id>` with the fields to change
|
|
151
151
|
|
|
@@ -219,7 +219,7 @@ Agents familiar with the web tool names can map them directly to CLI commands:
|
|
|
219
219
|
| `run_command` with `vfs` for `/org/tools/` | `sg tool find --id <id>` / `sg tool find <q>` | Full config with `--id`, compact search with a query string |
|
|
220
220
|
| `create_system` | `sg system create --name "..." --url "..."` | Use `--template <id>` when available |
|
|
221
221
|
| `edit_system` | `sg system edit --id <id> ...` | Supports `--env dev\|prod` |
|
|
222
|
-
| `run_command` with `vfs` for `/org/systems/` | `sg system find <query>` / `--id <id>` | Returns
|
|
222
|
+
| `run_command` with `vfs` for `/org/systems/` | `sg system find <query>` / `--id <id>` | Returns secret-key presence and the system URL |
|
|
223
223
|
| Credentials VFS / saved credentials | `sg system credentials get/set/clear` | Manage the current user's credentials for a system |
|
|
224
224
|
| `call_system` | `sg system call --url "..." --system-id <id>` | Authenticated ad-hoc calls for testing / schema introspection |
|
|
225
225
|
| `run_command search` | `sg system search-docs --system-id <id> -k` | Targeted keyword search over ingested system docs |
|
|
@@ -378,7 +378,8 @@ All step config fields (url, headers, body, queryParams) support `<<expression>>
|
|
|
378
378
|
<<page>> <<offset>> <<cursor>> <<limit>> <<pageSize>> pagination variables
|
|
379
379
|
<<systemId_api_key>> system credentials (namespaced: systemId_credKey)
|
|
380
380
|
<<systemId_url>> system base URLs (namespaced: systemId_url)
|
|
381
|
-
<<sg_auth_email>> email of the
|
|
381
|
+
<<sg_auth_email>> email of the user triggering this run (in scheduled runs: the schedule creator)
|
|
382
|
+
<<sg_auth_jwt>> short-lived signed JWT proving the identity of the user triggering this run; receivers verify it against superglue's outbound JWKS endpoint (/api/auth/outbound-jwks on the web app origin)
|
|
382
383
|
```
|
|
383
384
|
|
|
384
385
|
Simple `<<varName>>` only works for top-level keys. No dots, no nesting. `<<currentItem.id>>`, `<<sourceData.userId>>`, `<<user.name>>` all FAIL at runtime.
|
|
@@ -423,7 +424,7 @@ sourceData = {
|
|
|
423
424
|
|
|
424
425
|
Everything in `sourceData` shares ONE flat namespace. Saving a tool rejects payload input keys and step ids that collide with it:
|
|
425
426
|
|
|
426
|
-
- `__files__`, `currentItem`, `sg_auth_email` — injected by the runtime
|
|
427
|
+
- `__files__`, `currentItem`, `sg_auth_email`, `sg_auth_jwt` — injected by the runtime
|
|
427
428
|
- `page`, `offset`, `cursor`, `limit`, `pageSize` — rejected only when the tool has a paginated step, because they would shadow the live pagination counters; on non-paginated tools they are allowed but discouraged (a later edit that adds pagination will force a rename)
|
|
428
429
|
- the tool's own step ids — the step result overwrites a same-named payload key
|
|
429
430
|
- anything starting with `<systemId>_` for a system the tool uses — the entire prefix is reserved for namespaced credentials (`<systemId>_<credKey>`, `<systemId>_url`), even names that don't match an existing credential, because credentials added to the system later would silently shadow the input
|
|
@@ -491,10 +492,10 @@ All user-provided JS runs in an isolated Deno sandbox.
|
|
|
491
492
|
|
|
492
493
|
### Credentials and Systems
|
|
493
494
|
|
|
494
|
-
|
|
495
|
+
Secrets are referenced by name as `<<systemId_credentialKey>>` and resolved from the selected credential at execution time. You MUST explicitly reference them:
|
|
495
496
|
|
|
496
497
|
```
|
|
497
|
-
System id="stripe",
|
|
498
|
+
System id="stripe", selected credential has secret named: api_key
|
|
498
499
|
→ Available as: <<stripe_api_key>>
|
|
499
500
|
```
|
|
500
501
|
|
|
@@ -517,11 +518,11 @@ Basic auth auto-encodes: if the value after `Basic ` isn't already base64, the e
|
|
|
517
518
|
|
|
518
519
|
**Credential lifecycle:**
|
|
519
520
|
|
|
520
|
-
- Pass
|
|
521
|
-
- Use `sg system credentials set --system-id <id> --credentials '{...}'` to save
|
|
522
|
-
- Use `sg system credentials get --system-id <id>` to inspect current
|
|
521
|
+
- Pass all secret values via `--credentials '{"api_key":"...","client_secret":"..."}'` on create/edit
|
|
522
|
+
- Use `sg system credentials set --system-id <id> --credentials '{...}'` to save secrets in the current API-key user's credential
|
|
523
|
+
- Use `sg system credentials get --system-id <id>` to inspect the current user's secret names and whether each has a non-empty value; secret values are never returned
|
|
523
524
|
- OAuth tokens (`access_token`, `refresh_token`) auto-refresh before each step execution
|
|
524
|
-
- Non-sensitive fields (`client_id`, `auth_url`, `token_url`)
|
|
525
|
+
- Non-sensitive fields (`client_id`, `auth_url`, `token_url`) can be submitted alongside secrets in the same `--credentials` JSON
|
|
525
526
|
|
|
526
527
|
**System IDs:** lowercase letters, numbers, underscores only — no hyphens. Used for credential namespacing.
|
|
527
528
|
|
|
@@ -623,7 +624,6 @@ curl -X POST "https://api.superglue.cloud/v1/hooks/{toolId}?token=$SUPERGLUE_API
|
|
|
623
624
|
- **Double-encoded JSON** — when the body contains nested/stringified JSON (e.g. LLM APIs), have `<<>>` expressions return a string via `JSON.stringify(...)`, and use a single expression for the whole body rather than mixing `<<>>` with static JSON
|
|
624
625
|
- **POST for read-only ops** — GraphQL queries via POST should have `modify: false`. Don't rely on HTTP method alone
|
|
625
626
|
- **Saving without approval** — always present `sg tool run` results and ask before `sg tool save`
|
|
626
|
-
- **`sg_auth_email` in scheduled runs** — not available in scheduler-triggered executions. Tools using `<<sg_auth_email>>` will fail
|
|
627
627
|
- **Reserved key collisions** — payload inputs or step ids named after reserved/injected keys (see Naming Rules) are rejected at save time; pick a different name instead of retrying
|
|
628
628
|
|
|
629
629
|
---
|
|
@@ -640,14 +640,14 @@ For protocol-specific error recovery (HTTP, Postgres, MSSQL, Redis, MongoDB, Gra
|
|
|
640
640
|
|
|
641
641
|
1. Re-run with `--include-step-results` to see raw per-step responses and `data` fields
|
|
642
642
|
2. Use `sg system call` to test the failing endpoint directly — isolates step config vs system/auth issues
|
|
643
|
-
3. Use `sg system find --id <systemId>` to verify
|
|
643
|
+
3. Use `sg system find --id <systemId>` to verify the stored secret names match what the step references
|
|
644
644
|
4. For HTTP: run `sg skill http` and follow the error recovery section (endpoint vs system isolation, credential scopes, rate limiting)
|
|
645
645
|
5. For databases: run `sg skill postgres` or `sg skill mssql` — SSL/TLS and schema issues are common causes
|
|
646
646
|
6. Use `sg system search-docs` and web search to verify the current API shape. APIs change across versions
|
|
647
647
|
|
|
648
648
|
### Authentication failures
|
|
649
649
|
|
|
650
|
-
1. Run `sg system find --id <systemId>` → check
|
|
650
|
+
1. Run `sg system find --id <systemId>` → check which secret names are present and whether they have non-empty values
|
|
651
651
|
2. For OAuth: re-run `sg system oauth` if tokens are missing or expired
|
|
652
652
|
3. For custom OAuth: verify `client_id`, `client_secret`, `auth_url`, `token_url` are all present. Confirm the redirect URI is registered on the provider's OAuth app
|
|
653
653
|
4. Check scopes — 403 / empty responses often mean the token lacks required scopes
|
|
@@ -44,7 +44,7 @@ N/A — file handling is a runtime behavior, not a protocol. Authentication is h
|
|
|
44
44
|
|
|
45
45
|
Every response is read as raw bytes. The runtime classifies it using this priority chain:
|
|
46
46
|
|
|
47
|
-
1. **Magic-byte detection** — known binary signatures (ZIP `PK\x03\x04`, PDF `%PDF`, GZIP `\x1f\x8b`, plus internal ZIP structure checks for Excel/DOCX)
|
|
47
|
+
1. **Magic-byte detection** — known binary signatures (ZIP `PK\x03\x04`, PDF `%PDF`, GZIP `\x1f\x8b`, plus internal ZIP structure checks for Excel/DOCX/PPTX)
|
|
48
48
|
2. **`Content-Disposition: attachment`** — `attachment` or `filename=` in this header forces file treatment
|
|
49
49
|
3. **`application/octet-stream`** — explicit octet-stream MIME catches unlabeled binary payloads
|
|
50
50
|
4. **25MB size fallback** — only when byte detection returned `RAW`, the response exceeds 25MB, and `Content-Type` is not text-like (`text/*`, `application/json`, `*+json`, `application/xml`)
|
|
@@ -53,11 +53,11 @@ File server `get` operations always produce files regardless of detected type.
|
|
|
53
53
|
|
|
54
54
|
### Classification
|
|
55
55
|
|
|
56
|
-
| Classification | Types
|
|
57
|
-
| ------------------- |
|
|
58
|
-
| **Binary** | PDF, Excel, DOCX, ZIP, GZIP | `producedFiles` + `data` (extracted/parsed content) |
|
|
59
|
-
| **Structured text** | JSON, XML, CSV, YAML, HTML
|
|
60
|
-
| **RAW** | Unrecognized
|
|
56
|
+
| Classification | Types | Destination |
|
|
57
|
+
| ------------------- | --------------------------------- | -------------------------------------------------------------- |
|
|
58
|
+
| **Binary** | PDF, Excel, DOCX, PPTX, ZIP, GZIP | `producedFiles` + `data` (extracted/parsed content) |
|
|
59
|
+
| **Structured text** | JSON, XML, CSV, YAML, HTML | `data` only (parsed to JS objects) |
|
|
60
|
+
| **RAW** | Unrecognized | File if attachment/octet-stream/25MB fallback, else raw string |
|
|
61
61
|
|
|
62
62
|
Binary responses expose `stepFileKeys` and populate `sourceData.__files__`. Structured text responses only populate `sourceData.stepId.data`.
|
|
63
63
|
|
|
@@ -73,10 +73,13 @@ Binary responses expose `stepFileKeys` and populate `sourceData.__files__`. Stru
|
|
|
73
73
|
| Excel | Object keyed by sheet name, each value is array of row objects |
|
|
74
74
|
| PDF | `{ textContent, structuredContent: [{ page, text }] }` |
|
|
75
75
|
| DOCX | Markdown string |
|
|
76
|
+
| PPTX | Plain text, separated by slide |
|
|
76
77
|
| ZIP | Object keyed by entry filename, each value recursively parsed |
|
|
77
78
|
| GZIP | Recursively parsed inner content |
|
|
78
79
|
| RAW | UTF-8 string fallback |
|
|
79
80
|
|
|
81
|
+
**PPTX rules:** extraction includes slide text, including text inside basic tables. It does not include images, charts, layout, animations, or speaker notes.
|
|
82
|
+
|
|
80
83
|
**Excel rules:**
|
|
81
84
|
|
|
82
85
|
- Excel is never a flat array. It is always `{ "SheetName": [ {row}, ... ] }` — even for single-sheet files
|