n8n-nodes-orboto 1.0.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.
Files changed (53) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +107 -0
  3. package/dist/credentials/orbotoApi.credentials.d.ts +34 -0
  4. package/dist/credentials/orbotoApi.credentials.js +76 -0
  5. package/dist/credentials/orbotoApi.credentials.js.map +1 -0
  6. package/dist/credentials/orbotoOAuth2Api.credentials.d.ts +10 -0
  7. package/dist/credentials/orbotoOAuth2Api.credentials.js +73 -0
  8. package/dist/credentials/orbotoOAuth2Api.credentials.js.map +1 -0
  9. package/dist/nodes/index.d.ts +2 -0
  10. package/dist/nodes/index.js +19 -0
  11. package/dist/nodes/index.js.map +1 -0
  12. package/dist/nodes/orboto/orboto.node.d.ts +18 -0
  13. package/dist/nodes/orboto/orboto.node.js +192 -0
  14. package/dist/nodes/orboto/orboto.node.js.map +1 -0
  15. package/dist/nodes/orboto/orboto.svg +4 -0
  16. package/dist/nodes/orboto/orbotoTrigger.node.d.ts +19 -0
  17. package/dist/nodes/orboto/orbotoTrigger.node.js +243 -0
  18. package/dist/nodes/orboto/orbotoTrigger.node.js.map +1 -0
  19. package/dist/nodes/orboto/orbotoTrigger.svg +4 -0
  20. package/dist/nodes/orboto/resources/agent/agent.resource.d.ts +7 -0
  21. package/dist/nodes/orboto/resources/agent/agent.resource.js +183 -0
  22. package/dist/nodes/orboto/resources/agent/agent.resource.js.map +1 -0
  23. package/dist/nodes/orboto/resources/doc/doc.resource.d.ts +3 -0
  24. package/dist/nodes/orboto/resources/doc/doc.resource.js +206 -0
  25. package/dist/nodes/orboto/resources/doc/doc.resource.js.map +1 -0
  26. package/dist/nodes/orboto/resources/milestone/milestone.resource.d.ts +3 -0
  27. package/dist/nodes/orboto/resources/milestone/milestone.resource.js +197 -0
  28. package/dist/nodes/orboto/resources/milestone/milestone.resource.js.map +1 -0
  29. package/dist/nodes/orboto/resources/misc/misc.resources.d.ts +8 -0
  30. package/dist/nodes/orboto/resources/misc/misc.resources.js +232 -0
  31. package/dist/nodes/orboto/resources/misc/misc.resources.js.map +1 -0
  32. package/dist/nodes/orboto/resources/project/project.resource.d.ts +3 -0
  33. package/dist/nodes/orboto/resources/project/project.resource.js +144 -0
  34. package/dist/nodes/orboto/resources/project/project.resource.js.map +1 -0
  35. package/dist/nodes/orboto/resources/ticket/Ticket.resource.d.ts +11 -0
  36. package/dist/nodes/orboto/resources/ticket/Ticket.resource.js +1072 -0
  37. package/dist/nodes/orboto/resources/ticket/Ticket.resource.js.map +1 -0
  38. package/dist/nodes/orboto/resources/time/time.resource.d.ts +3 -0
  39. package/dist/nodes/orboto/resources/time/time.resource.js +140 -0
  40. package/dist/nodes/orboto/resources/time/time.resource.js.map +1 -0
  41. package/dist/nodes/orboto/shared/ApiClient.d.ts +97 -0
  42. package/dist/nodes/orboto/shared/ApiClient.js +261 -0
  43. package/dist/nodes/orboto/shared/ApiClient.js.map +1 -0
  44. package/dist/nodes/orboto/shared/GenericFunctions.d.ts +47 -0
  45. package/dist/nodes/orboto/shared/GenericFunctions.js +186 -0
  46. package/dist/nodes/orboto/shared/GenericFunctions.js.map +1 -0
  47. package/dist/nodes/orboto/shared/Types.d.ts +54 -0
  48. package/dist/nodes/orboto/shared/Types.js +10 -0
  49. package/dist/nodes/orboto/shared/Types.js.map +1 -0
  50. package/dist/nodes/orboto/shared/loadOptions.d.ts +17 -0
  51. package/dist/nodes/orboto/shared/loadOptions.js +85 -0
  52. package/dist/nodes/orboto/shared/loadOptions.js.map +1 -0
  53. package/package.json +68 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 orboto
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 ADDED
@@ -0,0 +1,107 @@
1
+ # n8n-nodes-orboto
2
+
3
+ [n8n](https://n8n.io) community nodes for [orboto](https://orboto.io) - automate tickets, milestones, projects, docs and more from your workflows.
4
+
5
+ [![CI](https://github.com/orboto/n8n-nodes-orboto/actions/workflows/ci.yml/badge.svg)](https://github.com/orboto/n8n-nodes-orboto/actions/workflows/ci.yml)
6
+ [![npm version](https://img.shields.io/npm/v/n8n-nodes-orboto.svg)](https://www.npmjs.com/package/n8n-nodes-orboto)
7
+
8
+ ## Installation
9
+
10
+ Install via the n8n UI: **Settings > Community nodes > Install** - enter `n8n-nodes-orboto`.
11
+
12
+ Or install manually in your n8n user folder (`.n8n` by default):
13
+
14
+ ```bash
15
+ cd ~/.n8n/custom
16
+ npm install n8n-nodes-orboto
17
+ ```
18
+
19
+ Restart n8n afterwards. Community nodes are enabled by default on n8n Cloud and self-hosted instances.
20
+
21
+ ## Credentials
22
+
23
+ Two credential types, both accepting a self-hosted base URL:
24
+
25
+ - **orboto API** (simplest): an API key from orboto (**Settings > API Keys**) plus your instance base URL. The connection test does an authenticated read and gives immediate feedback.
26
+ - **orboto OAuth2 API**: for instances with OAuth enabled. An administrator creates a static client under **Admin > OAuth clients** in orboto; paste its client id (and secret, if confidential) here. The default flow is PKCE with the `api offline_access` scope, so tokens refresh automatically. The authorize/token URLs are derived from the base URL (discovered at `/.well-known/oauth-authorization-server`).
27
+
28
+ Both `https://orboto.example.com` and `https://orboto.example.com/api` work as base URL.
29
+
30
+ ## Nodes
31
+
32
+ ### orboto
33
+
34
+ Action node covering the orboto REST API. Rate limits: 600 requests/minute per instance - prefer bulk operations and enable **Continue On Fail** for large batches.
35
+
36
+ | Resource | Operations |
37
+ | --- | --- |
38
+ | Ticket | Create, Get, Get Many (filters, Return All/Limit), Update, Delete, Move (Change Status), Assign, Unassign, Comment, Log Time, Add Label, Remove Label, OQL Query, Set/Clear Milestone, Set/Clear Version, Dependencies (Add/Remove/Get), Checklists (Add Item, Check, Uncheck), Attachments (Add multipart, Get Many), Bulk Update |
39
+ | Milestone | Create, Get, Get Many, Update, Close |
40
+ | Project | Create, Get, Get Many, Update, Get Primer Facts, Get AI Primer |
41
+ | Doc | Create, Get, Get Many, Update, Ask Docs (RAG), Ingest URL |
42
+ | Time Entry | Log, Get Many, Edit, Delete (ticket-scoped) |
43
+ | User | Get Project Members (no global user list in the orboto API) |
44
+ | Label | Create, Get Many |
45
+ | Saved Search | Create, Get Many, Run (OQL/JQL) |
46
+ | Agent | Notify, Get Messages, Ack Messages - the n8n-to-AI-agent bridge |
47
+
48
+ Ticket references accept keys (`ONN-42`), numbers (`42`) or ids everywhere. Dropdowns (project, milestone, status, member, label, version, space) load live from your instance.
49
+
50
+ Error semantics are surfaced as first-class options, not opaque failures:
51
+
52
+ - **422 language enforcement**: enable *Allow Language Mismatch* to create/update anyway; the response carries `languageWarning`.
53
+ - **409 duplicate block**: enable *Allow Duplicate* plus a required justification; `similarWarnings` land in the node output so workflows can branch.
54
+ - **423 legal hold** (delete): documented on the operation; **429 rate limit** guidance in the node description.
55
+
56
+ ### orboto Trigger
57
+
58
+ Fires workflows on orboto events over the orboto webhook system:
59
+
60
+ - Auto-registers a project-scoped webhook on workflow **activation** and removes it on **deactivation** (registered with the default payload format - the only HMAC-signed one).
61
+ - Every delivery is verified against the `X-Orboto-Signature` header (sha256 HMAC, constant-time compare); unsigned or forged requests are rejected.
62
+ - Events (16, versioned with this package): `ticket.created`, `ticket.updated`, `ticket.deleted`, `ticket.ready`, `ticket.checklist_item.completed`, `comment.created`, `comment.updated`, `comment.deleted`, `project.member_added`, `project.member_removed`, `milestone.created`, `milestone.updated`, `version.released`, `symphony.candidates_changed`, `inbound.signal.received`, `agent.escalation_raised` - plus a free-text field for events from newer orboto versions.
63
+
64
+ n8n must be reachable from your orboto instance (set `WEBHOOK_URL`/`N8N_WEBHOOK_URL` when running n8n behind a proxy).
65
+
66
+ ## Compatibility
67
+
68
+ - n8n version: 1.x and 2.x
69
+ - Node.js (running n8n): >= 20.19
70
+ - Node.js (building this package): >= 22
71
+
72
+ ## Example workflows
73
+
74
+ Importable JSON files live in [`examples/`](examples/):
75
+
76
+ - `create-ticket-from-webhook.json` - catch an inbound webhook (e.g. a form or mail parser) and create an orboto ticket.
77
+ - `notify-on-ticket-created.json` - orboto Trigger on `ticket.created` -> post to any HTTP endpoint.
78
+ - `nightly-oql-digest.json` - Schedule Trigger -> OQL query -> aggregate digest.
79
+ - `sync-ticket-to-external.json` - two-way sync with an external system: orboto Trigger -> upsert outbound, inbound webhook -> update the orboto ticket, with a loop guard.
80
+
81
+ ## Development
82
+
83
+ ```bash
84
+ npm install # install dependencies
85
+ npm run build # compile TypeScript to dist/ + copy icons
86
+ npm run lint # ESLint (includes n8n community-node package rules)
87
+ npm test # unit tests (vitest)
88
+ npm run format # prettier
89
+ ```
90
+
91
+ To try your local build in n8n, install the tarball (`npm pack`) into your `.n8n/custom` folder and restart n8n.
92
+
93
+ ## Releasing and the verified-community-node submission (operator steps)
94
+
95
+ Publishing and external submissions are operator-only. The package is kept submission-ready; from a clean checkout:
96
+
97
+ ```bash
98
+ npm ci && npm run lint && npm run build && npm test # all gates green
99
+ npm pack --dry-run # dist/ + icons only, zero runtime deps
100
+ ```
101
+
102
+ 1. **Publish** (npm org account required): push a `v*` tag - the `publish` workflow runs lint/build/test and publishes with provenance. Requires the `NPM_TOKEN` secret on the repo.
103
+ 2. **Verified community node submission**: check the current program rules at <https://docs.n8n.io/integrations/community-nodes/verification/> and submit `n8n-nodes-orboto` from the npm registry. Pre-verified checklist: package name convention `n8n-nodes-*` + keyword `n8n-community-node-package`; `n8n.nodes`/`n8n.credentials` registered; MIT license; no runtime dependencies; ESLint with `eslint-plugin-n8n-nodes-base` clean in CI; README + per-node docs + example workflows; tests in CI.
104
+
105
+ ## License
106
+
107
+ [MIT](LICENSE)
@@ -0,0 +1,34 @@
1
+ import type { ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ /** Declarative connection-test URL (GET /users/me, authenticated read). */
3
+ export declare const WHOAMI_TEST_URL_TEMPLATE = "={{ $credentials.baseUrl.trim().replace(/\\/+$/, \"\").replace(/\\/api$/, \"\") }}/api/users/me";
4
+ /** The raw expression, exported for unit tests (executed against sample base URLs). */
5
+ export declare const BASE_URL_NORMALIZE_EXPRESSION = "$credentials.baseUrl.trim().replace(/\\/+$/, \"\").replace(/\\/api$/, \"\")";
6
+ export declare class orbotoApi implements ICredentialType {
7
+ name: string;
8
+ displayName: string;
9
+ documentationUrl: string;
10
+ /** Injects the bearer token every orboto REST call needs. */
11
+ authenticate: {
12
+ type: "generic";
13
+ properties: {
14
+ headers: {
15
+ Authorization: string;
16
+ };
17
+ };
18
+ };
19
+ properties: INodeProperties[];
20
+ /** Connection test: an authenticated GET /users/me - cheap, read-only, works on every instance. */
21
+ test: {
22
+ request: {
23
+ method: "GET";
24
+ url: string;
25
+ };
26
+ rules: {
27
+ type: "responseCode";
28
+ properties: {
29
+ value: number;
30
+ message: string;
31
+ };
32
+ }[];
33
+ };
34
+ }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.orbotoApi = exports.BASE_URL_NORMALIZE_EXPRESSION = exports.WHOAMI_TEST_URL_TEMPLATE = void 0;
4
+ /**
5
+ * JavaScript expression applied to the user-entered base URL inside the
6
+ * declarative credential test. Mirrors ApiClient.normalizeBaseUrl: trim
7
+ * whitespace, strip trailing slashes, strip a trailing /api (re-added by
8
+ * the URL template) - so both `https://orboto.example.com` and
9
+ * `https://orboto.example.com/api` work.
10
+ */
11
+ const BASE_URL_NORMALIZE_EXPR = '$credentials.baseUrl.trim().replace(/\\/+$/, "").replace(/\\/api$/, "")';
12
+ /** Declarative connection-test URL (GET /users/me, authenticated read). */
13
+ exports.WHOAMI_TEST_URL_TEMPLATE = `={{ ${BASE_URL_NORMALIZE_EXPR} }}/api/users/me`;
14
+ /** The raw expression, exported for unit tests (executed against sample base URLs). */
15
+ exports.BASE_URL_NORMALIZE_EXPRESSION = BASE_URL_NORMALIZE_EXPR;
16
+ class orbotoApi {
17
+ name = 'orbotoApi';
18
+ displayName = 'orboto API';
19
+ documentationUrl = 'https://github.com/orboto/n8n-nodes-orboto#readme';
20
+ /** Injects the bearer token every orboto REST call needs. */
21
+ authenticate = {
22
+ type: 'generic',
23
+ properties: {
24
+ headers: {
25
+ Authorization: '=Bearer {{$credentials.apiKey}}',
26
+ },
27
+ },
28
+ };
29
+ properties = [
30
+ {
31
+ displayName: 'Base URL',
32
+ name: 'baseUrl',
33
+ type: 'string',
34
+ default: 'https://orboto.example.com',
35
+ placeholder: 'e.g. https://orboto.example.com',
36
+ required: true,
37
+ description: 'Base URL of your orboto instance, with or without the /api suffix (e.g. https://orboto.example.com or https://orboto.example.com/api)',
38
+ },
39
+ {
40
+ displayName: 'API Key',
41
+ name: 'apiKey',
42
+ type: 'string',
43
+ typeOptions: {
44
+ password: true,
45
+ },
46
+ default: '',
47
+ required: true,
48
+ description: 'API key for the orboto instance - create one under Settings > API Keys in orboto',
49
+ },
50
+ ];
51
+ /** Connection test: an authenticated GET /users/me - cheap, read-only, works on every instance. */
52
+ test = {
53
+ request: {
54
+ method: 'GET',
55
+ url: exports.WHOAMI_TEST_URL_TEMPLATE,
56
+ },
57
+ rules: [
58
+ {
59
+ type: 'responseCode',
60
+ properties: {
61
+ value: 401,
62
+ message: 'orboto rejected the API key (HTTP 401). Check the key in Settings > API Keys and try again.',
63
+ },
64
+ },
65
+ {
66
+ type: 'responseCode',
67
+ properties: {
68
+ value: 403,
69
+ message: 'orboto accepted the key but denied access (HTTP 403). The key may lack the permissions this credential needs.',
70
+ },
71
+ },
72
+ ],
73
+ };
74
+ }
75
+ exports.orbotoApi = orbotoApi;
76
+ //# sourceMappingURL=orbotoApi.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orbotoApi.credentials.js","sourceRoot":"","sources":["../../credentials/orbotoApi.credentials.ts"],"names":[],"mappings":";;;AAEA;;;;;;GAMG;AACH,MAAM,uBAAuB,GAC5B,yEAAyE,CAAC;AAE3E,2EAA2E;AAC9D,QAAA,wBAAwB,GAAG,OAAO,uBAAuB,kBAAkB,CAAC;AAEzF,uFAAuF;AAC1E,QAAA,6BAA6B,GAAG,uBAAuB,CAAC;AAErE,MAAa,SAAS;IACrB,IAAI,GAAG,WAAW,CAAC;IAEnB,WAAW,GAAG,YAAY,CAAC;IAE3B,gBAAgB,GAAG,mDAAmD,CAAC;IAEvE,6DAA6D;IAC7D,YAAY,GAAG;QACd,IAAI,EAAE,SAAkB;QACxB,UAAU,EAAE;YACX,OAAO,EAAE;gBACR,aAAa,EAAE,iCAAiC;aAChD;SACD;KACD,CAAC;IAEF,UAAU,GAAsB;QAC/B;YACC,WAAW,EAAE,UAAU;YACvB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,4BAA4B;YACrC,WAAW,EAAE,iCAAiC;YAC9C,QAAQ,EAAE,IAAI;YACd,WAAW,EACV,uIAAuI;SACxI;QACD;YACC,WAAW,EAAE,SAAS;YACtB,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE;gBACZ,QAAQ,EAAE,IAAI;aACd;YACD,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,kFAAkF;SAC/F;KACD,CAAC;IAEF,mGAAmG;IACnG,IAAI,GAAG;QACN,OAAO,EAAE;YACR,MAAM,EAAE,KAAc;YACtB,GAAG,EAAE,gCAAwB;SAC7B;QACD,KAAK,EAAE;YACN;gBACC,IAAI,EAAE,cAAuB;gBAC7B,UAAU,EAAE;oBACX,KAAK,EAAE,GAAG;oBACV,OAAO,EACN,6FAA6F;iBAC9F;aACD;YACD;gBACC,IAAI,EAAE,cAAuB;gBAC7B,UAAU,EAAE;oBACX,KAAK,EAAE,GAAG;oBACV,OAAO,EACN,+GAA+G;iBAChH;aACD;SACD;KACD,CAAC;CACF;AAlED,8BAkEC"}
@@ -0,0 +1,10 @@
1
+ import type { ICredentialType, INodeProperties } from 'n8n-workflow';
2
+ export declare class orbotoOAuth2Api implements ICredentialType {
3
+ name: string;
4
+ displayName: string;
5
+ documentationUrl: string;
6
+ /** Static OAuth client path (design review 2026-08-29): the admin creates a
7
+ * client under Admin > OAuth clients in orboto and pastes id/secret here. */
8
+ extends: string[];
9
+ properties: INodeProperties[];
10
+ }
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.orbotoOAuth2Api = void 0;
4
+ /** Base-URL expression shared by the authorize/token URL defaults. */
5
+ const BASE_URL_EXPR = '=$self["baseUrl"].replace(/\\/+$/, "")';
6
+ class orbotoOAuth2Api {
7
+ name = 'orbotoOAuth2Api';
8
+ displayName = 'orboto OAuth2 API';
9
+ documentationUrl = 'https://github.com/orboto/n8n-nodes-orboto#readme';
10
+ /** Static OAuth client path (design review 2026-08-29): the admin creates a
11
+ * client under Admin > OAuth clients in orboto and pastes id/secret here. */
12
+ extends = ['oAuth2Api'];
13
+ properties = [
14
+ {
15
+ displayName: 'Base URL',
16
+ name: 'baseUrl',
17
+ type: 'string',
18
+ default: 'https://orboto.example.com',
19
+ required: true,
20
+ placeholder: 'e.g. https://orboto.example.com',
21
+ description: 'Base URL of your orboto instance (without /api - the OAuth endpoints live at the instance root). The authorization and token URLs are derived from it automatically.',
22
+ },
23
+ {
24
+ displayName: 'Grant Type',
25
+ name: 'grantType',
26
+ type: 'options',
27
+ displayOptions: {
28
+ show: { useDynamicClientRegistration: [false] },
29
+ },
30
+ options: [
31
+ { name: 'Authorization Code', value: 'authorizationCode' },
32
+ { name: 'PKCE', value: 'pkce' },
33
+ ],
34
+ default: 'pkce',
35
+ description: 'PKCE is recommended; orboto supports S256',
36
+ },
37
+ {
38
+ displayName: 'Authorization URL',
39
+ name: 'authUrl',
40
+ type: 'string',
41
+ displayOptions: {
42
+ show: { grantType: ['authorizationCode', 'pkce'], useDynamicClientRegistration: [false] },
43
+ },
44
+ default: `={{${BASE_URL_EXPR}}}/oauth/authorize`,
45
+ required: true,
46
+ description: 'Derived from the Base URL (discovered at /.well-known/oauth-authorization-server)',
47
+ },
48
+ {
49
+ displayName: 'Access Token URL',
50
+ name: 'accessTokenUrl',
51
+ type: 'string',
52
+ typeOptions: { password: true },
53
+ displayOptions: {
54
+ show: { useDynamicClientRegistration: [false] },
55
+ },
56
+ default: `={{${BASE_URL_EXPR}}}/oauth/token`,
57
+ required: true,
58
+ description: 'Derived from the Base URL (discovered at /.well-known/oauth-authorization-server)',
59
+ },
60
+ {
61
+ displayName: 'Scope',
62
+ name: 'scope',
63
+ type: 'string',
64
+ displayOptions: {
65
+ show: { grantType: ['authorizationCode', 'pkce'], useDynamicClientRegistration: [false] },
66
+ },
67
+ default: 'api offline_access',
68
+ description: 'The api scope grants REST access; offline_access enables token refresh. Separate multiple scopes with spaces.',
69
+ },
70
+ ];
71
+ }
72
+ exports.orbotoOAuth2Api = orbotoOAuth2Api;
73
+ //# sourceMappingURL=orbotoOAuth2Api.credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orbotoOAuth2Api.credentials.js","sourceRoot":"","sources":["../../credentials/orbotoOAuth2Api.credentials.ts"],"names":[],"mappings":";;;AAEA,sEAAsE;AACtE,MAAM,aAAa,GAAG,wCAAwC,CAAC;AAE/D,MAAa,eAAe;IAC3B,IAAI,GAAG,iBAAiB,CAAC;IAEzB,WAAW,GAAG,mBAAmB,CAAC;IAElC,gBAAgB,GAAG,mDAAmD,CAAC;IAEvE;iFAC6E;IAC7E,OAAO,GAAG,CAAC,WAAW,CAAC,CAAC;IAExB,UAAU,GAAsB;QAC/B;YACC,WAAW,EAAE,UAAU;YACvB,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,4BAA4B;YACrC,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,iCAAiC;YAC9C,WAAW,EACV,sKAAsK;SACvK;QACD;YACC,WAAW,EAAE,YAAY;YACzB,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,SAAS;YACf,cAAc,EAAE;gBACf,IAAI,EAAE,EAAE,4BAA4B,EAAE,CAAC,KAAK,CAAC,EAAE;aAC/C;YACD,OAAO,EAAE;gBACR,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,mBAAmB,EAAE;gBAC1D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;aAC/B;YACD,OAAO,EAAE,MAAM;YACf,WAAW,EAAE,2CAA2C;SACxD;QACD;YACC,WAAW,EAAE,mBAAmB;YAChC,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,QAAQ;YACd,cAAc,EAAE;gBACf,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,mBAAmB,EAAE,MAAM,CAAC,EAAE,4BAA4B,EAAE,CAAC,KAAK,CAAC,EAAE;aACzF;YACD,OAAO,EAAE,MAAM,aAAa,oBAAoB;YAChD,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,mFAAmF;SAChG;QACD;YACC,WAAW,EAAE,kBAAkB;YAC/B,IAAI,EAAE,gBAAgB;YACtB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE;YAC/B,cAAc,EAAE;gBACf,IAAI,EAAE,EAAE,4BAA4B,EAAE,CAAC,KAAK,CAAC,EAAE;aAC/C;YACD,OAAO,EAAE,MAAM,aAAa,gBAAgB;YAC5C,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,mFAAmF;SAChG;QACD;YACC,WAAW,EAAE,OAAO;YACpB,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,QAAQ;YACd,cAAc,EAAE;gBACf,IAAI,EAAE,EAAE,SAAS,EAAE,CAAC,mBAAmB,EAAE,MAAM,CAAC,EAAE,4BAA4B,EAAE,CAAC,KAAK,CAAC,EAAE;aACzF;YACD,OAAO,EAAE,oBAAoB;YAC7B,WAAW,EAAE,+GAA+G;SAC5H;KACD,CAAC;CACF;AAtED,0CAsEC"}
@@ -0,0 +1,2 @@
1
+ export * from './orboto/shared/ApiClient';
2
+ export * from './orboto/shared/Types';
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./orboto/shared/ApiClient"), exports);
18
+ __exportStar(require("./orboto/shared/Types"), exports);
19
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../nodes/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4DAA0C;AAC1C,wDAAsC"}
@@ -0,0 +1,18 @@
1
+ import type { IExecuteFunctions, INodeExecutionData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ import { getLabels, getLabelNames, getMembers, getMilestones, getProjects, getSpaces, getStatuses, getVersions } from './shared/loadOptions';
3
+ export declare class orboto implements INodeType {
4
+ description: INodeTypeDescription;
5
+ methods: {
6
+ loadOptions: {
7
+ getProjects: typeof getProjects;
8
+ getMilestones: typeof getMilestones;
9
+ getStatuses: typeof getStatuses;
10
+ getMembers: typeof getMembers;
11
+ getLabels: typeof getLabels;
12
+ getLabelNames: typeof getLabelNames;
13
+ getVersions: typeof getVersions;
14
+ getSpaces: typeof getSpaces;
15
+ };
16
+ };
17
+ execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]>;
18
+ }
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.orboto = void 0;
4
+ const n8n_workflow_1 = require("n8n-workflow");
5
+ const Ticket_resource_1 = require("./resources/ticket/Ticket.resource");
6
+ const milestone_resource_1 = require("./resources/milestone/milestone.resource");
7
+ const project_resource_1 = require("./resources/project/project.resource");
8
+ const doc_resource_1 = require("./resources/doc/doc.resource");
9
+ const time_resource_1 = require("./resources/time/time.resource");
10
+ const misc_resources_1 = require("./resources/misc/misc.resources");
11
+ const agent_resource_1 = require("./resources/agent/agent.resource");
12
+ const loadOptions_1 = require("./shared/loadOptions");
13
+ class orboto {
14
+ description = {
15
+ displayName: 'orboto',
16
+ name: 'orboto',
17
+ icon: 'file:orboto.svg',
18
+ group: ['transform'],
19
+ version: 1,
20
+ subtitle: '={{$parameter["resource"] + ": " + $parameter["operation"]}}',
21
+ description: 'Automate tickets, milestones, projects, docs and more on an orboto instance. Rate limit: 600 requests/minute per instance - prefer bulk operations and enable Continue On Fail for large batches.',
22
+ defaults: {
23
+ name: 'orboto',
24
+ },
25
+ inputs: ['main'],
26
+ outputs: ['main'],
27
+ credentials: [
28
+ {
29
+ name: 'orbotoApi',
30
+ required: true,
31
+ displayOptions: {
32
+ show: {
33
+ authType: ['apiKey'],
34
+ },
35
+ },
36
+ },
37
+ {
38
+ name: 'orbotoOAuth2Api',
39
+ required: true,
40
+ displayOptions: {
41
+ show: {
42
+ authType: ['oauth'],
43
+ },
44
+ },
45
+ },
46
+ ],
47
+ properties: [
48
+ {
49
+ displayName: 'Authentication',
50
+ name: 'authType',
51
+ type: 'options',
52
+ noDataExpression: true,
53
+ options: [
54
+ {
55
+ name: 'API Key',
56
+ value: 'apiKey',
57
+ },
58
+ {
59
+ name: 'OAuth2',
60
+ value: 'oauth',
61
+ },
62
+ ],
63
+ default: 'apiKey',
64
+ description: 'Which orboto credential style this node uses',
65
+ },
66
+ {
67
+ displayName: 'Resource',
68
+ name: 'resource',
69
+ type: 'options',
70
+ noDataExpression: true,
71
+ options: [
72
+ {
73
+ name: 'Agent',
74
+ value: 'agent',
75
+ },
76
+ {
77
+ name: 'Doc',
78
+ value: 'doc',
79
+ },
80
+ {
81
+ name: 'Label',
82
+ value: 'label',
83
+ },
84
+ {
85
+ name: 'Milestone',
86
+ value: 'milestone',
87
+ },
88
+ {
89
+ name: 'Project',
90
+ value: 'project',
91
+ },
92
+ {
93
+ name: 'Saved Search',
94
+ value: 'savedSearch',
95
+ },
96
+ {
97
+ name: 'Ticket',
98
+ value: 'ticket',
99
+ },
100
+ {
101
+ name: 'Time Entry',
102
+ value: 'time',
103
+ },
104
+ {
105
+ name: 'User',
106
+ value: 'user',
107
+ },
108
+ ],
109
+ default: 'ticket',
110
+ required: true,
111
+ },
112
+ ...Ticket_resource_1.ticketOperations,
113
+ ...milestone_resource_1.milestoneOperations,
114
+ ...project_resource_1.projectOperations,
115
+ ...doc_resource_1.docOperations,
116
+ ...time_resource_1.timeOperations,
117
+ ...misc_resources_1.userOperations,
118
+ ...misc_resources_1.labelOperations,
119
+ ...misc_resources_1.savedSearchOperations,
120
+ ...agent_resource_1.agentOperations,
121
+ ],
122
+ };
123
+ methods = {
124
+ loadOptions: {
125
+ getProjects: loadOptions_1.getProjects,
126
+ getMilestones: loadOptions_1.getMilestones,
127
+ getStatuses: loadOptions_1.getStatuses,
128
+ getMembers: loadOptions_1.getMembers,
129
+ getLabels: loadOptions_1.getLabels,
130
+ getLabelNames: loadOptions_1.getLabelNames,
131
+ getVersions: loadOptions_1.getVersions,
132
+ getSpaces: loadOptions_1.getSpaces,
133
+ },
134
+ };
135
+ async execute() {
136
+ const items = this.getInputData(0);
137
+ const resource = this.getNodeParameter('resource', 0);
138
+ const responseData = [];
139
+ for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
140
+ try {
141
+ if (resource === 'ticket') {
142
+ responseData.push(...(await (0, Ticket_resource_1.executeTicketOperation)(this, itemIndex)));
143
+ }
144
+ else if (resource === 'milestone') {
145
+ responseData.push(...(await (0, milestone_resource_1.executeMilestoneOperation)(this, itemIndex)));
146
+ }
147
+ else if (resource === 'project') {
148
+ responseData.push(...(await (0, project_resource_1.executeProjectOperation)(this, itemIndex)));
149
+ }
150
+ else if (resource === 'doc') {
151
+ responseData.push(...(await (0, doc_resource_1.executeDocOperation)(this, itemIndex)));
152
+ }
153
+ else if (resource === 'time') {
154
+ responseData.push(...(await (0, time_resource_1.executeTimeOperation)(this, itemIndex)));
155
+ }
156
+ else if (resource === 'user') {
157
+ responseData.push(...(await (0, misc_resources_1.executeUserOperation)(this, itemIndex)));
158
+ }
159
+ else if (resource === 'label') {
160
+ responseData.push(...(await (0, misc_resources_1.executeLabelOperation)(this, itemIndex)));
161
+ }
162
+ else if (resource === 'savedSearch') {
163
+ responseData.push(...(await (0, misc_resources_1.executeSavedSearchOperation)(this, itemIndex)));
164
+ }
165
+ else if (resource === 'agent') {
166
+ responseData.push(...(await (0, agent_resource_1.executeAgentOperation)(this, itemIndex)));
167
+ }
168
+ else {
169
+ throw new n8n_workflow_1.NodeOperationError(this.getNode(), `Unknown resource: ${resource}`, {
170
+ itemIndex,
171
+ });
172
+ }
173
+ }
174
+ catch (error) {
175
+ if (this.continueOnFail()) {
176
+ responseData.push({
177
+ json: {
178
+ error: error instanceof Error
179
+ ? error.message
180
+ : 'The operation failed - check the node output for details',
181
+ },
182
+ });
183
+ continue;
184
+ }
185
+ throw error;
186
+ }
187
+ }
188
+ return [responseData];
189
+ }
190
+ }
191
+ exports.orboto = orboto;
192
+ //# sourceMappingURL=orboto.node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orboto.node.js","sourceRoot":"","sources":["../../../nodes/orboto/orboto.node.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24">
2
+ <circle cx="12" cy="12" r="10" fill="#4f46e5"/>
3
+ <circle cx="12" cy="12" r="4.5" fill="#ffffff"/>
4
+ </svg>
@@ -0,0 +1,19 @@
1
+ import type { IHookFunctions, IWebhookFunctions, IWebhookResponseData, INodeType, INodeTypeDescription } from 'n8n-workflow';
2
+ /** The orboto webhook event catalog (16 events), versioned with this package. */
3
+ export declare const ORBOTO_WEBHOOK_EVENTS: readonly ["ticket.created", "ticket.updated", "ticket.deleted", "ticket.ready", "ticket.checklist_item.completed", "comment.created", "comment.updated", "comment.deleted", "project.member_added", "project.member_removed", "milestone.created", "milestone.updated", "version.released", "symphony.candidates_changed", "inbound.signal.received", "agent.escalation_raised"];
4
+ /** Constant-time hex comparison; length-mismatched input is rejected outright. */
5
+ export declare function signatureMatches(received: string | undefined, expectedHex: string): boolean;
6
+ export declare class orbotoTrigger implements INodeType {
7
+ description: INodeTypeDescription;
8
+ webhookMethods: {
9
+ default: {
10
+ /** n8n calls this on activation: is a matching webhook already registered? */
11
+ checkExists(this: IHookFunctions): Promise<boolean>;
12
+ /** n8n calls this on activation when checkExists returned false. */
13
+ create(this: IHookFunctions): Promise<boolean>;
14
+ /** n8n calls this on deactivation. */
15
+ delete(this: IHookFunctions): Promise<boolean>;
16
+ };
17
+ };
18
+ webhook(this: IWebhookFunctions): Promise<IWebhookResponseData>;
19
+ }