@rolealpha/n8n-nodes-rolealpha 0.7.2 → 0.8.0
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/README.md +44 -37
- package/dist/lib/changes.d.ts +125 -70
- package/dist/lib/changes.js +202 -165
- package/dist/lib/changes.js.map +1 -1
- package/dist/lib/mcp.d.ts +1 -1
- package/dist/lib/mcp.js +18 -4
- package/dist/lib/mcp.js.map +1 -1
- package/dist/lib/workflows.d.ts +16 -3
- package/dist/lib/workflows.js +43 -5
- package/dist/lib/workflows.js.map +1 -1
- package/dist/nodes/RoleAlphaWorkflowBuilder/RoleAlphaWorkflowBuilder.node.d.ts +1 -1
- package/dist/nodes/RoleAlphaWorkflowBuilder/RoleAlphaWorkflowBuilder.node.js +83 -53
- package/dist/nodes/RoleAlphaWorkflowBuilder/RoleAlphaWorkflowBuilder.node.js.map +1 -1
- package/package.json +1 -1
package/dist/lib/changes.js
CHANGED
|
@@ -1,192 +1,229 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
|
-
* Change detection in the roleALPHA graph. roleALPHA
|
|
4
|
-
*
|
|
5
|
-
*
|
|
3
|
+
* Change detection in the roleALPHA graph. roleALPHA's list_changes names the entities that
|
|
4
|
+
* changed effectively since a cursor: approved drafts and every relationship change, fanned out
|
|
5
|
+
* to each end. One call per run replaces reading the whole organisation, so the cost grows with
|
|
6
|
+
* the changes, not with the size of the organisation.
|
|
6
7
|
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
8
|
+
* What counts: entities a managed workflow is bound to, and entities of the watched types
|
|
9
|
+
* (a new or changed step may need a workflow). What does not: relationships the runner resolves
|
|
10
|
+
* at run time, and on request the access's own writes (who decides, who holds a role, which policy
|
|
11
|
+
* applies). Those never require a workflow to change.
|
|
12
|
+
*
|
|
13
|
+
* A deleted entity does not appear itself; its neighbours get a relationship row whose other
|
|
14
|
+
* end is null. Such a row, a lost cursor or an earlier unreadable check makes the detector ask
|
|
15
|
+
* for every bound entity whether it still exists. Fail-closed: only "not found" counts as removed.
|
|
9
16
|
*/
|
|
10
17
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
-
exports.ENTITY_TYPES = void 0;
|
|
12
|
-
exports.
|
|
13
|
-
exports.
|
|
14
|
-
exports.
|
|
18
|
+
exports.NEIGHBOUR_RELATIONSHIPS = exports.RUNTIME_RELATIONSHIPS = exports.ENTITY_TYPES = void 0;
|
|
19
|
+
exports.normalizeFeedRows = normalizeFeedRows;
|
|
20
|
+
exports.summarizeFeed = summarizeFeed;
|
|
21
|
+
exports.readFeed = readFeed;
|
|
22
|
+
exports.checkExistence = checkExistence;
|
|
15
23
|
exports.detectChanges = detectChanges;
|
|
16
|
-
exports.
|
|
17
|
-
|
|
18
|
-
const crypto_1 = require("crypto");
|
|
19
|
-
const seal_1 = require("./seal");
|
|
20
|
-
/** Entity types of the lean index (list_entities). */
|
|
24
|
+
exports.boundEntities = boundEntities;
|
|
25
|
+
/** Entity types list_changes can filter on and Detect Changes can watch. */
|
|
21
26
|
exports.ENTITY_TYPES = ['process', 'role', 'agent', 'policy', 'organigramm', 'project', 'okr', 'person'];
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
customId: details.customId,
|
|
41
|
-
fields,
|
|
42
|
-
edges,
|
|
43
|
-
fingerprint: hash({ name, customId: details.customId, fields, edges }),
|
|
44
|
-
};
|
|
27
|
+
/** Relationships the runner reads at run time: a change to them never changes a workflow. */
|
|
28
|
+
exports.RUNTIME_RELATIONSHIPS = [
|
|
29
|
+
'DECIDES_ON',
|
|
30
|
+
'ACCOUNTABLE_FOR',
|
|
31
|
+
'RESPONSIBLE_FOR',
|
|
32
|
+
'CONSULTED_ON',
|
|
33
|
+
'INFORMED_ON',
|
|
34
|
+
'EXECUTES',
|
|
35
|
+
'AGENT_FULFILLS_ROLE',
|
|
36
|
+
'AGENT_SUPPORTS_PROCESS',
|
|
37
|
+
'AGENT_BOUND_BY_POLICY',
|
|
38
|
+
'IS_IMPLEMENTED_BY',
|
|
39
|
+
'APPLIES_TO',
|
|
40
|
+
];
|
|
41
|
+
/** Relationships that make a step a neighbour of another: the order and the breakdown of steps. */
|
|
42
|
+
exports.NEIGHBOUR_RELATIONSHIPS = ['DEPENDS_ON', 'HAS_SUBPROCESS'];
|
|
43
|
+
function obj(value) {
|
|
44
|
+
return value && typeof value === 'object' && !Array.isArray(value) ? value : {};
|
|
45
45
|
}
|
|
46
|
-
function
|
|
47
|
-
return
|
|
48
|
-
uuid: s.uuid,
|
|
49
|
-
entity_type: s.entityType,
|
|
50
|
-
name: s.name,
|
|
51
|
-
custom_id: s.customId,
|
|
52
|
-
fingerprint: s.fingerprint,
|
|
53
|
-
fields: JSON.stringify(s.fields),
|
|
54
|
-
edges: JSON.stringify(s.edges),
|
|
55
|
-
seen_at: seenAt,
|
|
56
|
-
};
|
|
46
|
+
function lower(value) {
|
|
47
|
+
return typeof value === 'string' ? value.trim().toLowerCase() : '';
|
|
57
48
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
49
|
+
/** Rows as list_changes returns them; drops rows without entity or change. */
|
|
50
|
+
function normalizeFeedRows(raw) {
|
|
51
|
+
const rows = Array.isArray(raw) ? raw : Array.isArray(obj(raw).changes) ? obj(raw).changes : [];
|
|
52
|
+
const out = [];
|
|
53
|
+
for (const r of rows.map(obj)) {
|
|
54
|
+
const entityUuid = lower(r.entityUuid);
|
|
55
|
+
const change = String(r.change ?? '');
|
|
56
|
+
if (!entityUuid || !['created', 'updated', 'deleted', 'relationship'].includes(change))
|
|
57
|
+
continue;
|
|
58
|
+
const v = obj(r.via);
|
|
59
|
+
const via = typeof v.relationshipType === 'string'
|
|
60
|
+
? {
|
|
61
|
+
relationshipId: v.relationshipId,
|
|
62
|
+
relTypeId: typeof v.relTypeId === 'number' ? v.relTypeId : undefined,
|
|
63
|
+
relationshipType: v.relationshipType,
|
|
64
|
+
otherEntityUuid: lower(v.otherEntityUuid) || null,
|
|
65
|
+
role: v.role,
|
|
66
|
+
action: (['added', 'changed', 'removed'].includes(String(v.action)) ? v.action : 'changed'),
|
|
67
|
+
}
|
|
68
|
+
: undefined;
|
|
69
|
+
out.push({
|
|
70
|
+
entityUuid,
|
|
71
|
+
entityType: String(r.entityType ?? ''),
|
|
72
|
+
changedAt: String(r.changedAt ?? ''),
|
|
73
|
+
change: change,
|
|
74
|
+
origin: typeof r.origin === 'string' ? r.origin : undefined,
|
|
75
|
+
ownChange: r.ownChange === true,
|
|
76
|
+
via,
|
|
77
|
+
});
|
|
68
78
|
}
|
|
79
|
+
return out;
|
|
69
80
|
}
|
|
70
|
-
/**
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
const types = new Set(opts.types);
|
|
89
|
-
// Rows of other types belong to another detector with another type filter; leave them alone.
|
|
90
|
-
const previous = normalizeRows(previousRaw).filter((r) => types.has(r.entity_type));
|
|
91
|
-
const unreadable = opts.unreadable ?? [];
|
|
92
|
-
const baseline = previous.length === 0 && !opts.reportBaseline;
|
|
93
|
-
const before = new Map(previous.map((r) => [r.uuid, r]));
|
|
94
|
-
const seen = new Set([...current.map((c) => c.uuid), ...unreadable.map((u) => u.uuid.toLowerCase())]);
|
|
95
|
-
const changes = [];
|
|
96
|
-
const upsert = [];
|
|
97
|
-
for (const snap of current) {
|
|
98
|
-
const old = before.get(snap.uuid);
|
|
99
|
-
if (old && old.fingerprint === snap.fingerprint)
|
|
81
|
+
/**
|
|
82
|
+
* Turns feed rows into one change per entity. `bound` maps entity UUIDs to the managed
|
|
83
|
+
* workflows bound to them; `watchTypes` are the types whose new and changed entities count
|
|
84
|
+
* even without a workflow.
|
|
85
|
+
*/
|
|
86
|
+
function summarizeFeed(rows, opts) {
|
|
87
|
+
const watch = new Set(opts.watchTypes);
|
|
88
|
+
const ignore = new Set(opts.ignoreRelationships ?? exports.RUNTIME_RELATIONSHIPS);
|
|
89
|
+
const skipped = { own: 0, runtime: 0, unwatched: 0 };
|
|
90
|
+
const byUuid = new Map();
|
|
91
|
+
let deletionSeen = false;
|
|
92
|
+
for (const row of rows) {
|
|
93
|
+
// A lost end is checked even when the row itself does not count.
|
|
94
|
+
if (row.change === 'relationship' && row.via && row.via.otherEntityUuid === null)
|
|
95
|
+
deletionSeen = true;
|
|
96
|
+
// ownChange compares the account: with a personal login it would also drop that person's approvals.
|
|
97
|
+
if (row.ownChange && opts.skipOwn) {
|
|
98
|
+
skipped.own++;
|
|
100
99
|
continue;
|
|
101
|
-
|
|
102
|
-
if (
|
|
100
|
+
}
|
|
101
|
+
if (!opts.bound.has(row.entityUuid) && !watch.has(row.entityType)) {
|
|
102
|
+
skipped.unwatched++;
|
|
103
103
|
continue;
|
|
104
|
-
|
|
105
|
-
|
|
104
|
+
}
|
|
105
|
+
if (row.change === 'relationship' && row.via && ignore.has(row.via.relationshipType)) {
|
|
106
|
+
skipped.runtime++;
|
|
106
107
|
continue;
|
|
107
108
|
}
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
if (old.name !== snap.name)
|
|
113
|
-
changedFields.unshift('name');
|
|
114
|
-
if ((old.custom_id ?? null) !== snap.customId)
|
|
115
|
-
changedFields.unshift('customId');
|
|
116
|
-
changes.push({
|
|
117
|
-
change: 'changed',
|
|
118
|
-
uuid: snap.uuid,
|
|
119
|
-
name: snap.name,
|
|
120
|
-
entityType: snap.entityType,
|
|
121
|
-
customId: snap.customId,
|
|
122
|
-
previousName: old.name !== snap.name ? old.name : null,
|
|
123
|
-
changedFields,
|
|
124
|
-
edgesAdded: snap.edges.filter((e) => !oldEdges.has(e)),
|
|
125
|
-
edgesRemoved: [...oldEdges].filter((e) => !newEdges.has(e)).sort(),
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
const remove = [];
|
|
129
|
-
if (opts.complete) {
|
|
130
|
-
for (const old of previous) {
|
|
131
|
-
if (seen.has(old.uuid))
|
|
132
|
-
continue;
|
|
133
|
-
remove.push(old.uuid);
|
|
134
|
-
if (!baseline) {
|
|
135
|
-
changes.push({ change: 'removed', uuid: old.uuid, name: old.name, entityType: old.entity_type, customId: old.custom_id, previousName: null, changedFields: [], edgesAdded: [], edgesRemoved: parseJson(old.edges, []) });
|
|
136
|
-
}
|
|
109
|
+
let c = byUuid.get(row.entityUuid);
|
|
110
|
+
if (!c) {
|
|
111
|
+
c = { change: 'changed', uuid: row.entityUuid, entityType: row.entityType, name: '', customId: null, changedAt: null, relationships: [], workflows: opts.bound.get(row.entityUuid) ?? [] };
|
|
112
|
+
byUuid.set(row.entityUuid, c);
|
|
137
113
|
}
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
for (let page = 0; page < maxPages; page++) {
|
|
150
|
-
const res = obj(await client.callTool('list_entities', { organisation, entityType, offset }));
|
|
151
|
-
const rows = Array.isArray(res.entities) ? res.entities : [];
|
|
152
|
-
for (const raw of rows.map(obj)) {
|
|
153
|
-
const uuid = typeof raw.uuid === 'string' ? raw.uuid.toLowerCase() : '';
|
|
154
|
-
if (uuid)
|
|
155
|
-
out.push({ uuid, name: String(raw.name ?? ''), entityType });
|
|
114
|
+
if (row.change === 'deleted')
|
|
115
|
+
c.change = 'removed';
|
|
116
|
+
else if (row.change === 'created' && c.change !== 'removed')
|
|
117
|
+
c.change = 'created';
|
|
118
|
+
if (!c.changedAt || row.changedAt > c.changedAt)
|
|
119
|
+
c.changedAt = row.changedAt || c.changedAt;
|
|
120
|
+
if (row.change === 'relationship' && row.via) {
|
|
121
|
+
const rel = { type: row.via.relationshipType, action: row.via.action, otherUuid: row.via.otherEntityUuid, end: row.via.role ?? null };
|
|
122
|
+
const key = JSON.stringify(rel);
|
|
123
|
+
if (!c.relationships.some((r) => JSON.stringify(r) === key))
|
|
124
|
+
c.relationships.push(rel);
|
|
156
125
|
}
|
|
157
|
-
if (res.hasMore !== true || rows.length === 0)
|
|
158
|
-
return out;
|
|
159
|
-
offset = typeof res.nextOffset === 'number' ? res.nextOffset : offset + rows.length;
|
|
160
126
|
}
|
|
161
|
-
|
|
127
|
+
return { changes: [...byUuid.values()], deletionSeen, skipped };
|
|
162
128
|
}
|
|
163
|
-
/**
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
129
|
+
/**
|
|
130
|
+
* Reads list_changes from a cursor, or on the first run from `since`, page by page.
|
|
131
|
+
* A failed call throws, so the stored cursor stays where it was.
|
|
132
|
+
*/
|
|
133
|
+
async function readFeed(client, organisation, start, opts = {}) {
|
|
134
|
+
const maxPages = Math.max(1, opts.maxPages ?? 20);
|
|
135
|
+
const limit = Math.min(500, Math.max(1, opts.limit ?? 500));
|
|
136
|
+
const rows = [];
|
|
137
|
+
let cursor = start.cursor ?? '';
|
|
138
|
+
let hasMore = false;
|
|
139
|
+
let pages = 0;
|
|
140
|
+
while (pages < maxPages) {
|
|
141
|
+
const args = { organisation, limit };
|
|
142
|
+
if (cursor)
|
|
143
|
+
args.cursor = cursor;
|
|
144
|
+
else if (start.since)
|
|
145
|
+
args.since = start.since;
|
|
146
|
+
else
|
|
147
|
+
throw new Error('list_changes needs a cursor or a start time');
|
|
148
|
+
const res = obj(await client.callTool('list_changes', args));
|
|
149
|
+
pages++;
|
|
150
|
+
if (typeof res.nextCursor !== 'string' || res.nextCursor === '')
|
|
151
|
+
throw new Error('list_changes returned no cursor');
|
|
152
|
+
rows.push(...normalizeFeedRows(res.changes));
|
|
153
|
+
cursor = res.nextCursor;
|
|
154
|
+
hasMore = res.hasMore === true;
|
|
155
|
+
if (!hasMore)
|
|
156
|
+
break;
|
|
157
|
+
}
|
|
158
|
+
return { rows, cursor, hasMore, pages };
|
|
175
159
|
}
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
160
|
+
const NOT_FOUND = /not found|nicht gefunden|existiert nicht/i;
|
|
161
|
+
/** Asks for every UUID whether it still exists. Only a plain "not found" counts as removed. */
|
|
162
|
+
async function checkExistence(client, organisation, uuids) {
|
|
163
|
+
const removed = [];
|
|
179
164
|
const unreadable = [];
|
|
180
|
-
|
|
165
|
+
for (const uuid of uuids) {
|
|
181
166
|
try {
|
|
182
|
-
const
|
|
183
|
-
|
|
167
|
+
const res = obj(await client.callTool('get_entity_details', { entityUuid: uuid, organisation }));
|
|
168
|
+
const error = typeof res.error === 'string' ? res.error : '';
|
|
169
|
+
if (!error)
|
|
170
|
+
continue;
|
|
171
|
+
if (NOT_FOUND.test(error))
|
|
172
|
+
removed.push(uuid);
|
|
173
|
+
else
|
|
174
|
+
unreadable.push({ uuid, error: error.slice(0, 300) });
|
|
184
175
|
}
|
|
185
176
|
catch (error) {
|
|
186
|
-
unreadable.push({ uuid
|
|
177
|
+
unreadable.push({ uuid, error: String(error.message ?? error).slice(0, 300) });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return { removed, unreadable };
|
|
181
|
+
}
|
|
182
|
+
async function detectChanges(client, organisation, state, opts) {
|
|
183
|
+
const started = !state.cursor;
|
|
184
|
+
const since = opts.since || (opts.now ?? new Date()).toISOString();
|
|
185
|
+
const feed = await readFeed(client, organisation, started ? { since } : { cursor: state.cursor }, { maxPages: opts.maxPages });
|
|
186
|
+
const summary = summarizeFeed(feed.rows, opts);
|
|
187
|
+
const changes = summary.changes;
|
|
188
|
+
let checked = 0;
|
|
189
|
+
let unreadable = [];
|
|
190
|
+
let recheck = false;
|
|
191
|
+
// Without a cursor nobody knows what happened in between, so the bound entities are checked once.
|
|
192
|
+
if (started || summary.deletionSeen || state.recheck) {
|
|
193
|
+
const known = new Set(changes.filter((c) => c.change === 'removed').map((c) => c.uuid));
|
|
194
|
+
const uuids = [...opts.bound.keys()].filter((u) => !known.has(u)).sort();
|
|
195
|
+
const check = await checkExistence(client, organisation, uuids);
|
|
196
|
+
checked = uuids.length;
|
|
197
|
+
unreadable = check.unreadable;
|
|
198
|
+
recheck = check.unreadable.length > 0;
|
|
199
|
+
for (const uuid of check.removed) {
|
|
200
|
+
const hit = changes.find((c) => c.uuid === uuid);
|
|
201
|
+
if (hit)
|
|
202
|
+
hit.change = 'removed';
|
|
203
|
+
else
|
|
204
|
+
changes.push({ change: 'removed', uuid, entityType: '', name: '', customId: null, changedAt: null, relationships: [], workflows: opts.bound.get(uuid) ?? [] });
|
|
187
205
|
}
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
changes,
|
|
209
|
+
cursor: feed.cursor,
|
|
210
|
+
hasMore: feed.hasMore,
|
|
211
|
+
started,
|
|
212
|
+
checked,
|
|
213
|
+
unreadable,
|
|
214
|
+
skipped: summary.skipped,
|
|
215
|
+
state: { cursor: feed.cursor, ...(recheck ? { recheck: true } : {}) },
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
/** Bound entity UUIDs of managed workflows (drafts excluded) to the IDs of those workflows. */
|
|
219
|
+
function boundEntities(workflows) {
|
|
220
|
+
const bound = new Map();
|
|
221
|
+
for (const w of workflows) {
|
|
222
|
+
if (w.isDraft)
|
|
223
|
+
continue;
|
|
224
|
+
for (const uuid of w.entities.map(lower).filter(Boolean))
|
|
225
|
+
bound.set(uuid, [...(bound.get(uuid) ?? []), w.id]);
|
|
226
|
+
}
|
|
227
|
+
return bound;
|
|
191
228
|
}
|
|
192
229
|
//# sourceMappingURL=changes.js.map
|
package/dist/lib/changes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../../lib/changes.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../../lib/changes.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/mcp.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export declare function parseRpcBody(body: string, id?: number | string): JsonRp
|
|
|
27
27
|
export declare function unwrapToolResult(result: unknown): unknown;
|
|
28
28
|
/** Waits before a repeated call; injected so tests run without delay. */
|
|
29
29
|
export type Sleep = (ms: number) => Promise<void>;
|
|
30
|
-
/** Wait before repeat `attempt` (0-based):
|
|
30
|
+
/** Wait before repeat `attempt` (0-based): what the server asked for, else 1, 2, 4, 8 s, plus jitter. */
|
|
31
31
|
export declare function retryDelay(reply: HttpReply | undefined, attempt: number, random?: () => number): number;
|
|
32
32
|
export declare class McpClient {
|
|
33
33
|
private readonly transport;
|
package/dist/lib/mcp.js
CHANGED
|
@@ -90,11 +90,25 @@ function unwrapToolResult(result) {
|
|
|
90
90
|
const sleepFor = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
91
91
|
/** Repeats of a call the server turned away for load (429, 503) or answered empty. */
|
|
92
92
|
const RETRIES = 4;
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
/** One window of the roleALPHA limiter is a minute; waiting longer never helps. */
|
|
94
|
+
const MAX_WAIT_MS = 61_000;
|
|
95
|
+
/** Seconds the server asks to wait: Retry-After, RateLimit-Reset, or reset= in a RateLimit header. */
|
|
96
|
+
function waitSeconds(reply) {
|
|
97
|
+
const plain = (name) => {
|
|
98
|
+
const v = header(reply.headers, name)?.trim();
|
|
99
|
+
return v !== undefined && /^\d+(\.\d+)?$/.test(v) ? Number(v) : NaN;
|
|
100
|
+
};
|
|
101
|
+
for (const name of ['retry-after', 'ratelimit-reset']) {
|
|
102
|
+
const s = plain(name);
|
|
103
|
+
if (Number.isFinite(s))
|
|
104
|
+
return s;
|
|
105
|
+
}
|
|
106
|
+
const m = /(?:^|[;,\s])reset=(\d+(?:\.\d+)?)/i.exec(header(reply.headers, 'ratelimit') ?? '');
|
|
107
|
+
return m ? Number(m[1]) : NaN;
|
|
108
|
+
}
|
|
109
|
+
/** Wait before repeat `attempt` (0-based): what the server asked for, else 1, 2, 4, 8 s, plus jitter. */
|
|
95
110
|
function retryDelay(reply, attempt, random = Math.random) {
|
|
96
|
-
const
|
|
97
|
-
const seconds = after !== undefined && /^\d+(\.\d+)?$/.test(after.trim()) ? Number(after) : NaN;
|
|
111
|
+
const seconds = reply ? waitSeconds(reply) : NaN;
|
|
98
112
|
const base = Number.isFinite(seconds) ? seconds * 1000 : 1000 * 2 ** attempt;
|
|
99
113
|
return Math.min(MAX_WAIT_MS, Math.round(base + random() * 500));
|
|
100
114
|
}
|
package/dist/lib/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../lib/mcp.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAuCH,oCAyBC;AAUD,4CAqBC;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../lib/mcp.ts"],"names":[],"mappings":"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"}
|