n8n-nodes-telepath 0.0.0-stage → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +16 -0
- package/LICENSE +21 -0
- package/README.md +103 -2
- package/RELEASE-CHECKLIST.md +37 -0
- package/dist/credentials/TelepathOAuth2Api.credentials.d.ts +13 -0
- package/dist/credentials/TelepathOAuth2Api.credentials.js +30 -0
- package/dist/credentials/TelepathOAuth2Api.credentials.js.map +1 -0
- package/dist/nodes/Telepath/Telepath.node.d.ts +5 -0
- package/dist/nodes/Telepath/Telepath.node.js +64 -0
- package/dist/nodes/Telepath/Telepath.node.js.map +1 -0
- package/dist/nodes/Telepath/Telepath.node.json +16 -0
- package/dist/nodes/Telepath/catalog.d.ts +40 -0
- package/dist/nodes/Telepath/catalog.js +39 -0
- package/dist/nodes/Telepath/catalog.js.map +1 -0
- package/dist/nodes/Telepath/catalog.json +3868 -0
- package/dist/nodes/Telepath/request.d.ts +10 -0
- package/dist/nodes/Telepath/request.js +82 -0
- package/dist/nodes/Telepath/request.js.map +1 -0
- package/dist/nodes/Telepath/telepath.dark.svg +1 -0
- package/dist/nodes/Telepath/telepath.svg +1 -0
- package/dist/nodes/Telepath/validation.d.ts +4 -0
- package/dist/nodes/Telepath/validation.js +118 -0
- package/dist/nodes/Telepath/validation.js.map +1 -0
- package/dist/package.json +56 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/examples/collect-chat-messages.json +326 -0
- package/examples/list-chats.json +51 -0
- package/examples/recent-message-snapshot.json +62 -0
- package/package.json +54 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## 0.1.2
|
|
4
|
+
|
|
5
|
+
- Preserve empty JSON request bodies in n8n's HTTP adapter so optional-only operations such as List Telegram chats work without adding a Limit field.
|
|
6
|
+
- Test OAuth credentials with an authenticated, read-only list-chats request, including accounts with an empty archive.
|
|
7
|
+
|
|
8
|
+
## 0.1.1
|
|
9
|
+
|
|
10
|
+
- Use the official n8n release command in GitHub Actions so the release guard and npm provenance are applied correctly.
|
|
11
|
+
- First public npm release; 0.1.0 publication stopped before upload.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## 0.1.0
|
|
15
|
+
|
|
16
|
+
Initial Telepath node with 30 operations across chats, media, Notes, reminders, channels, the separate bot inbox and scoped archive deletion. Includes OAuth dynamic client registration, S256 PKCE, account-scoped authorization, request pacing and bounded rate-limit handling. Ambiguous writes are not automatically retried.
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Lemma Company
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,104 @@
|
|
|
1
|
-
#
|
|
1
|
+
# n8n-nodes-telepath
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Connect your Telegram to n8n through [Telepath](https://telepath.lemma.company). Search your authorized archive, read messages and available voice/video-note transcripts, retrieve media, manage Notes and reminders, and perform authorized message and channel actions.
|
|
4
|
+
|
|
5
|
+
Telepath is hosted: you do not need to run a Telepath server or provide Telegram API ID/hash credentials. Your own n8n instance can be n8n Cloud or self-hosted, subject to package availability.
|
|
6
|
+
|
|
7
|
+
**Release:** [0.1.1 on npm](https://www.npmjs.com/package/n8n-nodes-telepath), published through GitHub Actions with provenance. The official n8n package scanner passed.
|
|
8
|
+
|
|
9
|
+
**Directory status:** community integration, not yet verified by n8n. Source and examples are public. n8n Cloud installation requires directory verification; use self-hosted n8n while verification is pending.
|
|
10
|
+
|
|
11
|
+
## Installation
|
|
12
|
+
|
|
13
|
+
Before verification, use a self-hosted development n8n instance. Clone this repository, run `npm ci`, `npm run build`, then `npm run dev`. For local evaluation, use this source directory. Do not install an unverified package in n8n Cloud: Cloud availability requires n8n approval.
|
|
14
|
+
|
|
15
|
+
After npm publication, self-hosted administrators can install `n8n-nodes-telepath` from Settings → Community Nodes. After verification, users with community nodes enabled will be able to find Telepath in the node panel.
|
|
16
|
+
|
|
17
|
+
## Credentials
|
|
18
|
+
|
|
19
|
+
Use a current n8n release supporting OAuth2 dynamic client registration (DCR). Node/credential loading and real DCR were checked on n8n 2.45.5. Real Telegram sign-in, chat reads, and a repeatable collection workflow were also tested. Native n8n token refresh was verified by simulating an invalid access token: n8n refreshed the credential and successfully retried the read.
|
|
20
|
+
|
|
21
|
+
1. Add the Telepath node and create a **Telepath OAuth2 API** credential.
|
|
22
|
+
2. Select **Connect my account** and complete Telegram sign-in in the browser. n8n registers its own OAuth client, uses S256 PKCE and refreshes tokens through its built-in OAuth2 implementation. No shared client secret or user token is bundled in this package.
|
|
23
|
+
3. In Telegram, open **Settings → Chat Automation**, add **@lemma_telepath_bot**, choose your private chats and save. Menu locations vary: [device setup guide](https://telepath.lemma.company/start#telegram).
|
|
24
|
+
4. Run **Chat → List Telegram chats** or **Read recent messages**. New messages arrive while collection is connected. Importing old history is optional and can be done later from a computer.
|
|
25
|
+
|
|
26
|
+
Sign-in and Telegram chat collection are separate steps. An empty archive does not prove that authentication is broken. Read the response's setup guidance. If DCR options are unavailable in your n8n version, upgrade n8n; do not put a Telegram bot token in an OAuth field.
|
|
27
|
+
|
|
28
|
+
The credential uses the fixed resource `https://telepath.lemma.company/mcp` and requests `telegram.read telegram.write`. Requests go only to `https://telepath.lemma.company/api/v1`. Account settings and server flags still decide which capabilities are available. Share a credential only with people authorized to access that account.
|
|
29
|
+
|
|
30
|
+
## Operations
|
|
31
|
+
|
|
32
|
+
| Resource | Operation | Telepath capability |
|
|
33
|
+
| --- | --- | --- |
|
|
34
|
+
| archive | Delete archived messages | `telegram_forget` |
|
|
35
|
+
| botInbox | List bot inbox messages | `telegram_bot_direct_messages` |
|
|
36
|
+
| botInbox | React in the bot inbox | `telegram_bot_dm_react` |
|
|
37
|
+
| botInbox | Reply in the bot inbox | `telegram_bot_dm_reply` |
|
|
38
|
+
| channel | Delete a channel post | `telegram_delete_post` |
|
|
39
|
+
| channel | Edit a channel post | `telegram_edit_post` |
|
|
40
|
+
| channel | Pin or unpin a channel post | `telegram_set_post_pinned` |
|
|
41
|
+
| channel | Publish a channel post | `telegram_create_post` |
|
|
42
|
+
| chat | Edit a sent message | `telegram_edit_message` |
|
|
43
|
+
| chat | Find a chat | `telegram_find_chat` |
|
|
44
|
+
| chat | List Telegram chats | `telegram_list_chats` |
|
|
45
|
+
| chat | Mark a conversation read | `telegram_mark_read` |
|
|
46
|
+
| chat | Read chat messages | `telegram_get_messages` |
|
|
47
|
+
| chat | Read recent messages | `telegram_recent_messages` |
|
|
48
|
+
| chat | Search messages | `telegram_search_messages` |
|
|
49
|
+
| chat | Send a message | `telegram_send_message` |
|
|
50
|
+
| chat | Set or remove a reaction | `telegram_set_reaction` |
|
|
51
|
+
| media | Get an archived photo | `telegram_get_photo` |
|
|
52
|
+
| media | Get multiple archived photos | `telegram_get_photos` |
|
|
53
|
+
| media | Read an archived file | `telegram_get_file` |
|
|
54
|
+
| media | Send a photo or document | `telegram_send_media` |
|
|
55
|
+
| note | Create a note or task | `kb_create_note` |
|
|
56
|
+
| note | Delete a note | `kb_delete_note` |
|
|
57
|
+
| note | List notes | `kb_list_notes` |
|
|
58
|
+
| note | Read a note | `kb_get_note` |
|
|
59
|
+
| note | Search notes | `kb_search_notes` |
|
|
60
|
+
| note | Update a note or task | `kb_update_note` |
|
|
61
|
+
| reminder | Cancel a reminder | `cancel_reminder` |
|
|
62
|
+
| reminder | Create a reminder | `create_reminder` |
|
|
63
|
+
| reminder | List reminders | `list_reminders` |
|
|
64
|
+
|
|
65
|
+
The **Get an archived photo** result includes the photo data and expiring link. It also covers the data used by ChatGPT's `telegram_show_photo`; the ChatGPT-specific display widget is not an n8n feature. This package does not administer accounts, configure Auto-reply, import exports or delete an entire account. Those are bot/setup features, not exposed MCP actions.
|
|
66
|
+
|
|
67
|
+
Task reminders, media replacement when editing a channel post, albums, buttons, note tags and note types are supported. Complex values use JSON fields with schema validation. Optional fields are sent only when added; explicit `false`, `[]`, empty body strings and `null` reminders are preserved.
|
|
68
|
+
|
|
69
|
+
## Limits, polling and output
|
|
70
|
+
|
|
71
|
+
- REST requests share the server's **120 requests per minute per account** limit across credentials and workflows. Splitting tokens does not increase the allowance. Telegram and plan limits apply independently.
|
|
72
|
+
- Within an execution, input items run sequentially with a default **1-second minimum pause** between requests. Increase **Options → Request Interval** for large batches. This pacing is local to an execution; the server enforces the shared limit.
|
|
73
|
+
- The node retries HTTP 429 at most twice and honors `Retry-After`. If the requested wait exceeds 60 seconds, it stops and tells you how long to wait. A missing/invalid header uses a 60-second wait. No retry loops for permissions, expired credentials, invalid parameters or ambiguous delivery.
|
|
74
|
+
- Writes are retried only for the Telepath REST gateway's explicit pre-dispatch `rate_limited` response. Telegram rate-limit responses and network/5xx errors on writes are never automatically replayed.
|
|
75
|
+
- Start scheduled archive reads at **every five minutes**; see `examples/recent-message-snapshot.json`. A scheduled snapshot can contain the same messages again. It is not a guaranteed new-message trigger and does not maintain a delivery cursor. Deduplicate by chat ID + message ID before downstream actions. Narrow the chat and date range when possible.
|
|
76
|
+
- Most list/search endpoints return bounded windows and do not expose a complete pagination cursor; the node does not invent a Return All option. Reminder listing supports offset pagination. Batch photo reads accept at most five message IDs.
|
|
77
|
+
- Default output preserves the complete response including quota and setup guidance. **Split Results** emits array entries individually and preserves response metadata as `telepathMeta`; empty results retain the original response.
|
|
78
|
+
- Media retrieval/transcription availability depends on Telegram permissions, stored file references and your account. Imported history without media does not create downloadable attachments. Reading a transcript does not initiate transcription.
|
|
79
|
+
|
|
80
|
+
## Write actions
|
|
81
|
+
|
|
82
|
+
Enable **Authorize Action** only after checking the intended action and targets. This authorizes the configured workflow, not an approval dialog on each scheduled run. For AI-driven actions, put n8n human approval before the write node or use tightly controlled targets. Treat chat/file/note content as untrusted data.
|
|
83
|
+
|
|
84
|
+
Keep n8n's **Retry On Fail disabled for write nodes**; the node refuses writes if it is enabled, because a whole-batch retry could repeat completed actions. Verify the destination after timeouts or uncertain errors. Channel operations require `confirmed=true` and a stable `requestId`; reuse the same ID only with identical action details. Reminder creation supports the same optional idempotency key. Ordinary sends do not have an idempotency key and must not be replayed blindly, including by error workflows or a parent workflow retry.
|
|
85
|
+
|
|
86
|
+
Bot inbox messages are a separate conversation from Business messages, even if chat IDs coincide. Reply through the Bot Inbox resource. Archive deletion removes only Telepath stored messages in the specified chat/date scope; it requires explicit confirmation and the account's deletion capability, and does not delete the Telegram conversation. Never enable broad deletion in an unattended workflow without defining its scope.
|
|
87
|
+
|
|
88
|
+
## Examples and development
|
|
89
|
+
|
|
90
|
+
- `examples/list-chats.json`: manual, read-only connection check.
|
|
91
|
+
- `examples/recent-message-snapshot.json`: disabled-by-default five-minute snapshot, requiring selection of your own credential.
|
|
92
|
+
- `examples/collect-chat-messages.json`: selects the first available non-channel chat, reads its latest 200 messages, and upserts rows in an n8n Data Table keyed by chat ID + message ID. Later runs keep the same chat using saved rows. The five-minute schedule is inactive until published. This bounded-window example is not guaranteed complete capture during bursts or downtime. Requires n8n Data Tables (tested on 2.45.5).
|
|
93
|
+
|
|
94
|
+
Use Node.js 24 for development and CI. Run `npm ci`, `npm test`, `npm run lint` and `npm pack --dry-run`. The npm runtime package has no external dependencies beyond the n8n-provided `n8n-workflow` peer. Tests use synthetic responses and local HTTP fixtures; they do not send real Telegram messages.
|
|
95
|
+
|
|
96
|
+
The node uses programmatic execution to apply safe read/write retry rules, pace item batches, validate optional structured fields and preserve setup metadata when splitting results. It uses n8n's authenticated HTTP helpers; no filesystem, environment-variable or direct network-library access occurs in the runtime node.
|
|
97
|
+
|
|
98
|
+
The repository includes GitHub Actions CI and provenance publishing. Configure an npm trusted publisher for `Lemma-Company/n8n-nodes-telepath` and `publish.yml` before releasing. n8n directory review remains pending; see `RELEASE-CHECKLIST.md`.
|
|
99
|
+
|
|
100
|
+
Support: https://telepath.lemma.company/support
|
|
101
|
+
Privacy: https://telepath.lemma.company/privacy
|
|
102
|
+
Terms: https://telepath.lemma.company/terms
|
|
103
|
+
|
|
104
|
+
MIT © Lemma Company.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Release checklist
|
|
2
|
+
|
|
3
|
+
## Implemented locally
|
|
4
|
+
|
|
5
|
+
- 30 typed, allowlisted operations with no arbitrary API URL or tool dispatch.
|
|
6
|
+
- OAuth2 credentials using n8n dynamic registration and S256 PKCE.
|
|
7
|
+
- No bundled tokens/client secrets and no runtime dependencies beyond n8n's peer.
|
|
8
|
+
- Account permissions and plan allowances remain enforced by Telepath.
|
|
9
|
+
- Per-item pacing and bounded 429 handling; ambiguous writes are not replayed.
|
|
10
|
+
- Write approval, scoped archive deletion, bot-inbox separation.
|
|
11
|
+
- English documentation, examples, MIT, CI and provenance publishing workflow.
|
|
12
|
+
|
|
13
|
+
## Verification before public submission
|
|
14
|
+
|
|
15
|
+
- [x] Real n8n 2.45.5 loads Telepath, its AI-tool variant and OAuth credential (checked through its authenticated API).
|
|
16
|
+
- [x] User completed setup and OAuth in the n8n editor and confirmed a successful manual run. The user also reviewed the icon; automated browser visual QA was unavailable.
|
|
17
|
+
- [x] Real n8n DCR against Telepath passed after explicit approval: authorization URL, S256, scopes, canonical resource and redirect URI verified. This initial DCR-only check issued no user tokens; the later user-authorized sign-in is recorded below.
|
|
18
|
+
- [x] Real Telegram sign-in and read operations passed. A collector workflow saved 200 messages into a temporary n8n table; a repeat run retained 200 unique rows. A subsequent user-run updated the same 200 rows without duplicates.
|
|
19
|
+
- [x] Verify refresh using n8n's actual OAuth helper: injected an invalid access token into the isolated test credential; native refresh saved a new token and the complete read/table workflow succeeded. Temporary plaintext credential files were removed. Revoked-grant reconnect remains a manual support path.
|
|
20
|
+
- [x] 30-operation REST catalog deployed; existing 25 routes preserved. Health and unauthenticated guards checked.
|
|
21
|
+
- [x] Public `Lemma-Company/n8n-nodes-telepath` repository created; GitHub CI passed. npm publisher verified as `olegnikeshin`, with user-confirmed 2FA.
|
|
22
|
+
- [x] Configure npm trusted publishing for `.github/workflows/publish.yml`.
|
|
23
|
+
- [x] Publish version 0.1.1 from tag `v0.1.1` through GitHub Actions with provenance (run 40849007959). Version 0.1.0 stopped before upload because the workflow initially bypassed the official release command.
|
|
24
|
+
- [x] Official `@n8n/scan-community-package` passed all checks for `n8n-nodes-telepath@0.1.1`, including attested source at commit `8369b69`.
|
|
25
|
+
- [ ] Submit through https://creators.n8n.io/nodes and address reviewer feedback.
|
|
26
|
+
|
|
27
|
+
The local tests use synthetic accounts and mocked Telegram calls. They do not prove the complete n8n browser sign-in journey or imply that n8n has approved this package. Do not mark external gates complete based only on local build/lint output.
|
|
28
|
+
|
|
29
|
+
## 0.1.2 regression verification
|
|
30
|
+
|
|
31
|
+
- 15 package tests pass, including optional-only POST bodies and the credential probe definition; strict lint passes.
|
|
32
|
+
- 60 requests across all 30 operations pass through the actual n8n 2.45.5 HTTP adapter to a local receiver: minimum required fields and populated optional fields. JSON bodies are checked against the backend REST schemas; GET query/path mapping is checked separately.
|
|
33
|
+
- Reproduce the cross-repository transport check after building both projects with:
|
|
34
|
+
`node tests/http-contract.mjs /path/to/n8n-runtime /path/to/telepath-backend`.
|
|
35
|
+
The runtime directory must contain `node_modules/@n8n/backend-network`; the backend must contain `dist/rest-catalog.js`. Test traffic stays on localhost. No user credentials are used.
|
|
36
|
+
- The backend's 19 isolated REST tests pass with synthetic accounts and mocked Telegram calls.
|
|
37
|
+
- This coverage verifies serialization, routing and server behavior in fixtures. Real message sends, reactions, archive deletion and channel publishing were not executed against user chats.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ICredentialTestRequest, ICredentialType, INodeProperties } from 'n8n-workflow';
|
|
2
|
+
export declare class TelepathOAuth2Api implements ICredentialType {
|
|
3
|
+
name: string;
|
|
4
|
+
extends: string[];
|
|
5
|
+
displayName: string;
|
|
6
|
+
documentationUrl: string;
|
|
7
|
+
icon: {
|
|
8
|
+
readonly light: "file:../nodes/Telepath/telepath.svg";
|
|
9
|
+
readonly dark: "file:../nodes/Telepath/telepath.dark.svg";
|
|
10
|
+
};
|
|
11
|
+
test: ICredentialTestRequest;
|
|
12
|
+
properties: INodeProperties[];
|
|
13
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TelepathOAuth2Api = void 0;
|
|
4
|
+
class TelepathOAuth2Api {
|
|
5
|
+
constructor() {
|
|
6
|
+
this.name = 'telepathOAuth2Api';
|
|
7
|
+
this.extends = ['oAuth2Api'];
|
|
8
|
+
this.displayName = 'Telepath OAuth2 API';
|
|
9
|
+
this.documentationUrl = 'https://github.com/Lemma-Company/n8n-nodes-telepath#credentials';
|
|
10
|
+
this.icon = { light: 'file:../nodes/Telepath/telepath.svg', dark: 'file:../nodes/Telepath/telepath.dark.svg' };
|
|
11
|
+
this.test = {
|
|
12
|
+
request: {
|
|
13
|
+
baseURL: 'https://telepath.lemma.company/api/v1',
|
|
14
|
+
url: '/chats/list',
|
|
15
|
+
method: 'POST',
|
|
16
|
+
headers: { 'Content-Type': 'application/json' },
|
|
17
|
+
body: { limit: 1 },
|
|
18
|
+
},
|
|
19
|
+
};
|
|
20
|
+
this.properties = [
|
|
21
|
+
{ displayName: 'Use Dynamic Client Registration', name: 'useDynamicClientRegistration', type: 'hidden', default: true },
|
|
22
|
+
{ displayName: 'Server URL', name: 'serverUrl', type: 'hidden', default: 'https://telepath.lemma.company/mcp' },
|
|
23
|
+
{ displayName: 'Resource URL', name: 'resourceUrl', type: 'hidden', default: 'https://telepath.lemma.company/mcp' },
|
|
24
|
+
{ displayName: 'Grant Type', name: 'grantType', type: 'hidden', default: 'pkce' },
|
|
25
|
+
{ displayName: 'Scope', name: 'scope', type: 'hidden', default: 'telegram.read telegram.write' },
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.TelepathOAuth2Api = TelepathOAuth2Api;
|
|
30
|
+
//# sourceMappingURL=TelepathOAuth2Api.credentials.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelepathOAuth2Api.credentials.js","sourceRoot":"","sources":["../../credentials/TelepathOAuth2Api.credentials.ts"],"names":[],"mappings":";;;AAEA,MAAa,iBAAiB;IAA9B;QACE,SAAI,GAAG,mBAAmB,CAAC;QAC3B,YAAO,GAAG,CAAC,WAAW,CAAC,CAAC;QACxB,gBAAW,GAAG,qBAAqB,CAAC;QACpC,qBAAgB,GAAG,iEAAiE,CAAC;QACrF,SAAI,GAAG,EAAC,KAAK,EAAE,qCAAqC,EAAE,IAAI,EAAE,0CAA0C,EAAU,CAAC;QACjH,SAAI,GAA2B;YAC7B,OAAO,EAAE;gBACP,OAAO,EAAE,uCAAuC;gBAChD,GAAG,EAAE,aAAa;gBAClB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;aACnB;SACF,CAAC;QACF,eAAU,GAAsB;YAC9B,EAAE,WAAW,EAAE,iCAAiC,EAAE,IAAI,EAAE,8BAA8B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE;YACvH,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oCAAoC,EAAE;YAC/G,EAAE,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oCAAoC,EAAE;YACnH,EAAE,WAAW,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE;YACjF,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,8BAA8B,EAAE;SACjG,CAAC;IACJ,CAAC;CAAA;AAtBD,8CAsBC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
|
|
2
|
+
export declare class Telepath implements INodeType {
|
|
3
|
+
description: INodeTypeDescription;
|
|
4
|
+
execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
|
|
5
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Telepath = void 0;
|
|
4
|
+
const n8n_workflow_1 = require("n8n-workflow");
|
|
5
|
+
const catalog_1 = require("./catalog");
|
|
6
|
+
const validation_1 = require("./validation");
|
|
7
|
+
const request_1 = require("./request");
|
|
8
|
+
class Telepath {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.description = {
|
|
11
|
+
displayName: 'Telepath', name: 'telepath', icon: { light: 'file:telepath.svg', dark: 'file:telepath.dark.svg' }, group: ['transform'], version: 1,
|
|
12
|
+
subtitle: '={{$parameter["operation"]}}',
|
|
13
|
+
description: 'Search your Telegram archive and work with messages, media, Notes, reminders and channels',
|
|
14
|
+
defaults: { name: 'Telepath' }, inputs: [n8n_workflow_1.NodeConnectionTypes.Main], outputs: [n8n_workflow_1.NodeConnectionTypes.Main],
|
|
15
|
+
usableAsTool: true, credentials: [{ name: 'telepathOAuth2Api', required: true }], properties: catalog_1.properties,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
async execute() {
|
|
19
|
+
var _a;
|
|
20
|
+
const output = [];
|
|
21
|
+
const items = this.getInputData();
|
|
22
|
+
for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
|
|
23
|
+
try {
|
|
24
|
+
const resource = this.getNodeParameter('resource', itemIndex);
|
|
25
|
+
const tool = this.getNodeParameter('operation', itemIndex);
|
|
26
|
+
const op = catalog_1.operations.find(o => o.tool === tool && o.resource === resource);
|
|
27
|
+
if (!op)
|
|
28
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Select a supported Telepath resource and operation.');
|
|
29
|
+
if (op.write && this.getNode().retryOnFail)
|
|
30
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Disable Retry On Fail for write operations. Replaying a completed batch can duplicate actions.');
|
|
31
|
+
if (op.write && this.getNodeParameter('authorizeAction', itemIndex, false) !== true)
|
|
32
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), 'Enable Authorize Action only after checking the action and targets.');
|
|
33
|
+
const settings = this.getNodeParameter('options', itemIndex, {});
|
|
34
|
+
const interval = Math.max(1000, Math.min(60000, Number(settings.requestInterval) || 1000));
|
|
35
|
+
if (itemIndex > 0)
|
|
36
|
+
await (0, n8n_workflow_1.sleep)(interval);
|
|
37
|
+
const optional = this.getNodeParameter('additionalFields', itemIndex, {});
|
|
38
|
+
const args = (0, validation_1.argumentsFor)(op, name => this.getNodeParameter(name, itemIndex), optional, this.getNode());
|
|
39
|
+
const result = await (0, request_1.requestOperation)(op, args, options => this.helpers.httpRequestWithAuthentication.call(this, 'telepathOAuth2Api', options), n8n_workflow_1.sleep, this.getNode());
|
|
40
|
+
const key = ['chats', 'messages', 'notes', 'reminders', 'photos'].find(k => Array.isArray(result[k]));
|
|
41
|
+
if (settings.splitResults && key && result[key].length) {
|
|
42
|
+
const { [key]: rows, ...meta } = result;
|
|
43
|
+
for (const row of rows)
|
|
44
|
+
output.push({ json: { ...row, telepathMeta: meta }, pairedItem: { item: itemIndex } });
|
|
45
|
+
}
|
|
46
|
+
else
|
|
47
|
+
output.push({ json: result, pairedItem: { item: itemIndex } });
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
const safe = error instanceof Error ? error.message : 'Telepath operation failed.';
|
|
51
|
+
if (this.continueOnFail()) {
|
|
52
|
+
output.push({ json: { error: safe }, pairedItem: { item: itemIndex } });
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (error instanceof n8n_workflow_1.NodeApiError)
|
|
56
|
+
throw new n8n_workflow_1.NodeApiError(this.getNode(), {}, { message: safe, httpCode: (_a = error.httpCode) !== null && _a !== void 0 ? _a : undefined, itemIndex });
|
|
57
|
+
throw new n8n_workflow_1.NodeOperationError(this.getNode(), safe, { itemIndex });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
return [output];
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
exports.Telepath = Telepath;
|
|
64
|
+
//# sourceMappingURL=Telepath.node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Telepath.node.js","sourceRoot":"","sources":["../../../nodes/Telepath/Telepath.node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"node": "n8n-nodes-telepath.telepath",
|
|
3
|
+
"nodeVersion": "1.0",
|
|
4
|
+
"codexVersion": "1.0",
|
|
5
|
+
"categories": [
|
|
6
|
+
"Communication",
|
|
7
|
+
"Productivity"
|
|
8
|
+
],
|
|
9
|
+
"resources": {
|
|
10
|
+
"primaryDocumentation": [
|
|
11
|
+
{
|
|
12
|
+
"url": "https://github.com/Lemma-Company/n8n-nodes-telepath#readme"
|
|
13
|
+
}
|
|
14
|
+
]
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { INodeProperties } from 'n8n-workflow';
|
|
2
|
+
export interface Schema {
|
|
3
|
+
type?: string;
|
|
4
|
+
properties?: Record<string, Schema>;
|
|
5
|
+
required?: string[];
|
|
6
|
+
items?: Schema;
|
|
7
|
+
anyOf?: Schema[];
|
|
8
|
+
enum?: unknown[];
|
|
9
|
+
const?: unknown;
|
|
10
|
+
minimum?: number;
|
|
11
|
+
maximum?: number;
|
|
12
|
+
exclusiveMinimum?: number;
|
|
13
|
+
exclusiveMaximum?: number;
|
|
14
|
+
minLength?: number;
|
|
15
|
+
maxLength?: number;
|
|
16
|
+
minItems?: number;
|
|
17
|
+
maxItems?: number;
|
|
18
|
+
pattern?: string;
|
|
19
|
+
format?: string;
|
|
20
|
+
additionalProperties?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export interface Operation {
|
|
23
|
+
tool: string;
|
|
24
|
+
resource: string;
|
|
25
|
+
path: string;
|
|
26
|
+
method: 'GET' | 'POST';
|
|
27
|
+
summary: string;
|
|
28
|
+
description: string;
|
|
29
|
+
write: boolean;
|
|
30
|
+
schema: Schema;
|
|
31
|
+
fields: Array<{
|
|
32
|
+
apiName: string;
|
|
33
|
+
name: string;
|
|
34
|
+
schema: Schema;
|
|
35
|
+
required: boolean;
|
|
36
|
+
ui: INodeProperties;
|
|
37
|
+
}>;
|
|
38
|
+
}
|
|
39
|
+
export declare const operations: Operation[];
|
|
40
|
+
export declare const properties: INodeProperties[];
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.properties = exports.operations = void 0;
|
|
7
|
+
const catalog_json_1 = __importDefault(require("./catalog.json"));
|
|
8
|
+
exports.operations = catalog_json_1.default;
|
|
9
|
+
const names = { archive: 'Archive', botInbox: 'Bot Inbox', channel: 'Channel', chat: 'Chat', media: 'Media', note: 'Note', reminder: 'Reminder' };
|
|
10
|
+
const defaults = { archive: 'telegram_forget', botInbox: 'telegram_bot_direct_messages', channel: 'telegram_create_post', chat: 'telegram_list_chats', media: 'telegram_get_file', note: 'kb_list_notes', reminder: 'list_reminders' };
|
|
11
|
+
exports.properties = [
|
|
12
|
+
{ displayName: 'Resource', name: 'resource', type: 'options', noDataExpression: true,
|
|
13
|
+
options: Object.entries(names).map(([value, name]) => ({ name, value })), default: 'chat' },
|
|
14
|
+
];
|
|
15
|
+
for (const resource of Object.keys(names)) {
|
|
16
|
+
const group = exports.operations.filter(o => o.resource === resource).sort((a, b) => a.summary.localeCompare(b.summary));
|
|
17
|
+
exports.properties.push({ displayName: 'Operation', name: 'operation', type: 'options', noDataExpression: true,
|
|
18
|
+
displayOptions: { show: { resource: [resource] } },
|
|
19
|
+
options: group.map(o => ({ name: o.summary, value: o.tool, action: o.summary, description: o.description })),
|
|
20
|
+
default: '' });
|
|
21
|
+
exports.properties[exports.properties.length - 1].default = defaults[resource];
|
|
22
|
+
for (const op of group) {
|
|
23
|
+
const displayOptions = { show: { resource: [resource], operation: [op.tool] } };
|
|
24
|
+
exports.properties.push({ displayName: op.description, name: 'operationNotice', type: 'notice', default: '', displayOptions });
|
|
25
|
+
for (const field of op.fields.filter(f => f.required))
|
|
26
|
+
exports.properties.push({ ...field.ui, displayOptions });
|
|
27
|
+
const optional = op.fields.filter(f => !f.required).map(f => f.ui).sort((a, b) => a.displayName.localeCompare(b.displayName));
|
|
28
|
+
if (optional.length)
|
|
29
|
+
exports.properties.push({ displayName: 'Additional Fields', name: 'additionalFields', type: 'collection', placeholder: 'Add Field', default: {}, displayOptions, options: optional });
|
|
30
|
+
if (op.write)
|
|
31
|
+
exports.properties.push({ displayName: 'Authorize Action', name: 'authorizeAction', type: 'boolean', default: false, displayOptions,
|
|
32
|
+
description: 'Whether you authorize this workflow to perform the selected action on the specified targets. Disable Retry On Fail for write operations.' });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.properties.push({ displayName: 'Options', name: 'options', type: 'collection', placeholder: 'Add Option', default: {}, options: [
|
|
36
|
+
{ displayName: 'Request Interval (Ms)', name: 'requestInterval', type: 'number', default: 1000, typeOptions: { minValue: 1000, maxValue: 60000, numberPrecision: 0 }, description: 'Minimum pause between requests in this execution. Other workflows share the server account limit.' },
|
|
37
|
+
{ displayName: 'Split Results', name: 'splitResults', type: 'boolean', default: false, description: 'Whether to emit each chat, message, note, reminder or photo as its own item. Empty responses and setup guidance are preserved.' },
|
|
38
|
+
] });
|
|
39
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../../nodes/Telepath/catalog.ts"],"names":[],"mappings":"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"}
|