digital-workers 2.1.1 → 2.3.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/CHANGELOG.md +23 -0
- package/README.md +136 -180
- package/dist/actions.d.ts.map +1 -1
- package/dist/actions.js +34 -21
- package/dist/actions.js.map +1 -1
- package/dist/agent-comms.d.ts +438 -0
- package/dist/agent-comms.d.ts.map +1 -0
- package/dist/agent-comms.js +677 -0
- package/dist/agent-comms.js.map +1 -0
- package/dist/approve.d.ts +40 -8
- package/dist/approve.d.ts.map +1 -1
- package/dist/approve.js +86 -20
- package/dist/approve.js.map +1 -1
- package/dist/ask.d.ts +38 -7
- package/dist/ask.d.ts.map +1 -1
- package/dist/ask.js +85 -25
- package/dist/ask.js.map +1 -1
- package/dist/browse.d.ts +223 -0
- package/dist/browse.d.ts.map +1 -0
- package/dist/browse.js +392 -0
- package/dist/browse.js.map +1 -0
- package/dist/capability-tiers.d.ts +230 -0
- package/dist/capability-tiers.d.ts.map +1 -0
- package/dist/capability-tiers.js +388 -0
- package/dist/capability-tiers.js.map +1 -0
- package/dist/cascade-context.d.ts +523 -0
- package/dist/cascade-context.d.ts.map +1 -0
- package/dist/cascade-context.js +494 -0
- package/dist/cascade-context.js.map +1 -0
- package/dist/client.d.ts +162 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +64 -0
- package/dist/client.js.map +1 -0
- package/dist/decide.d.ts +42 -6
- package/dist/decide.d.ts.map +1 -1
- package/dist/decide.js +54 -11
- package/dist/decide.js.map +1 -1
- package/dist/do.d.ts +36 -7
- package/dist/do.d.ts.map +1 -1
- package/dist/do.js +82 -39
- package/dist/do.js.map +1 -1
- package/dist/error-escalation.d.ts +416 -0
- package/dist/error-escalation.d.ts.map +1 -0
- package/dist/error-escalation.js +656 -0
- package/dist/error-escalation.js.map +1 -0
- package/dist/generate.d.ts +48 -7
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +49 -8
- package/dist/generate.js.map +1 -1
- package/dist/goals.d.ts +10 -9
- package/dist/goals.d.ts.map +1 -1
- package/dist/goals.js +30 -24
- package/dist/goals.js.map +1 -1
- package/dist/image.d.ts +189 -0
- package/dist/image.d.ts.map +1 -0
- package/dist/image.js +528 -0
- package/dist/image.js.map +1 -0
- package/dist/index.d.ts +59 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +92 -2
- package/dist/index.js.map +1 -1
- package/dist/is.d.ts +45 -10
- package/dist/is.d.ts.map +1 -1
- package/dist/is.js +56 -21
- package/dist/is.js.map +1 -1
- package/dist/kpis.d.ts +24 -15
- package/dist/kpis.d.ts.map +1 -1
- package/dist/kpis.js +16 -14
- package/dist/kpis.js.map +1 -1
- package/dist/load-balancing.d.ts +395 -0
- package/dist/load-balancing.d.ts.map +1 -0
- package/dist/load-balancing.js +991 -0
- package/dist/load-balancing.js.map +1 -0
- package/dist/logger.d.ts +76 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +39 -0
- package/dist/logger.js.map +1 -0
- package/dist/notify.d.ts +38 -9
- package/dist/notify.d.ts.map +1 -1
- package/dist/notify.js +72 -17
- package/dist/notify.js.map +1 -1
- package/dist/role.d.ts +5 -4
- package/dist/role.d.ts.map +1 -1
- package/dist/role.js +13 -10
- package/dist/role.js.map +1 -1
- package/dist/runtime.d.ts +310 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +510 -0
- package/dist/runtime.js.map +1 -0
- package/dist/team.d.ts +11 -6
- package/dist/team.d.ts.map +1 -1
- package/dist/team.js +22 -15
- package/dist/team.js.map +1 -1
- package/dist/transports/email.d.ts +318 -0
- package/dist/transports/email.d.ts.map +1 -0
- package/dist/transports/email.js +779 -0
- package/dist/transports/email.js.map +1 -0
- package/dist/transports/slack.d.ts +515 -0
- package/dist/transports/slack.d.ts.map +1 -0
- package/dist/transports/slack.js +844 -0
- package/dist/transports/slack.js.map +1 -0
- package/dist/transports.d.ts.map +1 -1
- package/dist/transports.js +44 -25
- package/dist/transports.js.map +1 -1
- package/dist/types.d.ts +149 -19
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/id.d.ts +19 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +21 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/video.d.ts +203 -0
- package/dist/video.d.ts.map +1 -0
- package/dist/video.js +528 -0
- package/dist/video.js.map +1 -0
- package/dist/worker.d.ts +343 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +698 -0
- package/dist/worker.js.map +1 -0
- package/package.json +24 -5
- package/src/actions.ts +48 -38
- package/src/agent-comms.ts +1200 -0
- package/src/approve.ts +91 -20
- package/src/ask.ts +99 -25
- package/src/browse.ts +627 -0
- package/src/capability-tiers.ts +545 -0
- package/src/cascade-context.ts +648 -0
- package/src/client.ts +221 -0
- package/src/decide.ts +81 -35
- package/src/do.ts +98 -52
- package/src/error-escalation.ts +1123 -0
- package/src/generate.ts +52 -18
- package/src/goals.ts +36 -27
- package/src/image.ts +816 -0
- package/src/index.ts +410 -2
- package/src/is.ts +59 -25
- package/src/kpis.ts +41 -36
- package/src/load-balancing.ts +1467 -0
- package/src/logger.ts +93 -0
- package/src/notify.ts +78 -17
- package/src/role.ts +30 -20
- package/src/runtime.ts +796 -0
- package/src/team.ts +24 -19
- package/src/transports/email.ts +1160 -0
- package/src/transports/slack.ts +1320 -0
- package/src/transports.ts +58 -43
- package/src/types.ts +182 -46
- package/src/utils/id.ts +21 -0
- package/src/video.ts +906 -0
- package/src/worker.ts +1007 -0
- package/test/agent-comms.test.ts +1397 -0
- package/test/approve.test.ts +305 -0
- package/test/ask.test.ts +274 -0
- package/test/browse.test.ts +361 -0
- package/test/capability-tiers.test.ts +631 -0
- package/test/cascade-context.test.ts +692 -0
- package/test/decide.test.ts +252 -0
- package/test/do.test.ts +144 -0
- package/test/error-escalation.test.ts +1205 -0
- package/test/error-logging.test.ts +357 -0
- package/test/generate.test.ts +319 -0
- package/test/image.test.ts +398 -0
- package/test/is.test.ts +287 -0
- package/test/load-balancing-safety.test.ts +404 -0
- package/test/load-balancing-thread-safety.test.ts +464 -0
- package/test/load-balancing.test.ts +1145 -0
- package/test/notify.test.ts +434 -0
- package/test/primitives.test.ts +320 -0
- package/test/runtime-integration.test.ts +892 -0
- package/test/transports/crypto.test.ts +230 -0
- package/test/transports/email.test.ts +866 -0
- package/test/transports/id-generation.test.ts +91 -0
- package/test/transports/slack.test.ts +760 -0
- package/test/type-safety.test.ts +834 -0
- package/test/types.test.ts +95 -2
- package/test/video.test.ts +530 -0
- package/test/worker.test.ts +1433 -0
- package/tsconfig.json +4 -1
- package/vitest.config.ts +42 -0
- package/wrangler.jsonc +36 -0
- package/.turbo/turbo-build.log +0 -5
- package/src/actions.js +0 -436
- package/src/approve.js +0 -234
- package/src/ask.js +0 -226
- package/src/decide.js +0 -244
- package/src/do.js +0 -227
- package/src/generate.js +0 -298
- package/src/goals.js +0 -205
- package/src/index.js +0 -68
- package/src/is.js +0 -317
- package/src/kpis.js +0 -270
- package/src/notify.js +0 -219
- package/src/role.js +0 -110
- package/src/team.js +0 -130
- package/src/transports.js +0 -357
- package/src/types.js +0 -71
package/dist/runtime.js
ADDED
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Integration for Human Request Processing
|
|
3
|
+
*
|
|
4
|
+
* Connects transport adapters (Slack, Email, etc.) to a request store and
|
|
5
|
+
* provides orchestration for approval workflows, questions, and notifications.
|
|
6
|
+
*
|
|
7
|
+
* The HumanRequestProcessor is the central coordinator that:
|
|
8
|
+
* - Sends requests via configured transports
|
|
9
|
+
* - Tracks request state in a store
|
|
10
|
+
* - Handles webhook callbacks from transports
|
|
11
|
+
* - Notifies when requests complete or timeout
|
|
12
|
+
*
|
|
13
|
+
* @packageDocumentation
|
|
14
|
+
*/
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// In-Memory Request Store
|
|
17
|
+
// =============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* In-memory implementation of HumanRequestStore
|
|
20
|
+
*
|
|
21
|
+
* Suitable for development and testing. For production, implement
|
|
22
|
+
* a store backed by Durable Objects, KV, or a database.
|
|
23
|
+
*/
|
|
24
|
+
export class InMemoryRequestStore {
|
|
25
|
+
requests = new Map();
|
|
26
|
+
externalIdIndex = new Map();
|
|
27
|
+
counter = 0;
|
|
28
|
+
generateId() {
|
|
29
|
+
this.counter++;
|
|
30
|
+
return `req_${Date.now()}_${this.counter.toString().padStart(4, '0')}`;
|
|
31
|
+
}
|
|
32
|
+
async create(data) {
|
|
33
|
+
const id = this.generateId();
|
|
34
|
+
const request = {
|
|
35
|
+
id,
|
|
36
|
+
type: data.type,
|
|
37
|
+
target: data.target,
|
|
38
|
+
content: data.content,
|
|
39
|
+
status: 'pending',
|
|
40
|
+
transport: data.transport,
|
|
41
|
+
createdAt: new Date(),
|
|
42
|
+
};
|
|
43
|
+
if (data.requestedBy !== undefined) {
|
|
44
|
+
request.requestedBy = data.requestedBy;
|
|
45
|
+
}
|
|
46
|
+
if (data.context !== undefined) {
|
|
47
|
+
request.context = data.context;
|
|
48
|
+
}
|
|
49
|
+
if (data.notifyChannel !== undefined) {
|
|
50
|
+
request.notifyChannel = data.notifyChannel;
|
|
51
|
+
}
|
|
52
|
+
if (data.expiresAt !== undefined) {
|
|
53
|
+
request.expiresAt = data.expiresAt;
|
|
54
|
+
}
|
|
55
|
+
this.requests.set(id, request);
|
|
56
|
+
return request;
|
|
57
|
+
}
|
|
58
|
+
async get(id) {
|
|
59
|
+
return this.requests.get(id);
|
|
60
|
+
}
|
|
61
|
+
async update(id, data) {
|
|
62
|
+
const request = this.requests.get(id);
|
|
63
|
+
if (!request) {
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
if (data.status !== undefined) {
|
|
67
|
+
request.status = data.status;
|
|
68
|
+
}
|
|
69
|
+
if (data.externalId !== undefined) {
|
|
70
|
+
request.externalId = data.externalId;
|
|
71
|
+
this.externalIdIndex.set(data.externalId, id);
|
|
72
|
+
}
|
|
73
|
+
if (data.result !== undefined) {
|
|
74
|
+
request.result = data.result;
|
|
75
|
+
}
|
|
76
|
+
if (data.completedAt !== undefined) {
|
|
77
|
+
request.completedAt = data.completedAt;
|
|
78
|
+
}
|
|
79
|
+
// Auto-set completedAt when status becomes terminal
|
|
80
|
+
if (data.status === 'completed' || data.status === 'expired' || data.status === 'cancelled') {
|
|
81
|
+
if (!request.completedAt) {
|
|
82
|
+
request.completedAt = new Date();
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
this.requests.set(id, request);
|
|
86
|
+
return request;
|
|
87
|
+
}
|
|
88
|
+
async findByExternalId(externalId) {
|
|
89
|
+
const requestId = this.externalIdIndex.get(externalId);
|
|
90
|
+
if (!requestId) {
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
return this.requests.get(requestId);
|
|
94
|
+
}
|
|
95
|
+
async listPending() {
|
|
96
|
+
const pending = [];
|
|
97
|
+
for (const request of this.requests.values()) {
|
|
98
|
+
if (request.status === 'pending') {
|
|
99
|
+
pending.push(request);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return pending;
|
|
103
|
+
}
|
|
104
|
+
async listExpired() {
|
|
105
|
+
const now = new Date();
|
|
106
|
+
const expired = [];
|
|
107
|
+
for (const request of this.requests.values()) {
|
|
108
|
+
if (request.status === 'pending' && request.expiresAt && request.expiresAt <= now) {
|
|
109
|
+
expired.push(request);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return expired;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// =============================================================================
|
|
116
|
+
// Human Request Processor
|
|
117
|
+
// =============================================================================
|
|
118
|
+
/**
|
|
119
|
+
* Human Request Processor
|
|
120
|
+
*
|
|
121
|
+
* Coordinates between transport adapters and the request store to
|
|
122
|
+
* handle approval workflows, questions, and notifications.
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```ts
|
|
126
|
+
* const processor = createHumanRequestProcessor({
|
|
127
|
+
* store: new InMemoryRequestStore(),
|
|
128
|
+
* transports: {
|
|
129
|
+
* slack: createSlackTransport({ botToken, signingSecret }),
|
|
130
|
+
* email: createEmailTransport({ apiKey }),
|
|
131
|
+
* },
|
|
132
|
+
* onComplete: (data) => {
|
|
133
|
+
* console.log(`Request ${data.requestId} completed:`, data.result)
|
|
134
|
+
* },
|
|
135
|
+
* })
|
|
136
|
+
*
|
|
137
|
+
* // Submit a request
|
|
138
|
+
* const result = await processor.submitRequest({
|
|
139
|
+
* type: 'approval',
|
|
140
|
+
* target: '#approvals',
|
|
141
|
+
* content: 'Approve deployment?',
|
|
142
|
+
* transport: 'slack',
|
|
143
|
+
* })
|
|
144
|
+
*
|
|
145
|
+
* // Handle webhook when user responds
|
|
146
|
+
* await processor.handleWebhook('slack', {
|
|
147
|
+
* type: 'approval_response',
|
|
148
|
+
* requestId: result.requestId,
|
|
149
|
+
* approved: true,
|
|
150
|
+
* })
|
|
151
|
+
* ```
|
|
152
|
+
*/
|
|
153
|
+
export class HumanRequestProcessor {
|
|
154
|
+
store;
|
|
155
|
+
transports;
|
|
156
|
+
onCompleteCallback;
|
|
157
|
+
onTimeoutCallback;
|
|
158
|
+
notifyRequestor;
|
|
159
|
+
checkIntervalMs;
|
|
160
|
+
timeoutChecker = null;
|
|
161
|
+
destroyed = false;
|
|
162
|
+
constructor(config) {
|
|
163
|
+
this.store = config.store;
|
|
164
|
+
this.transports = config.transports;
|
|
165
|
+
this.onCompleteCallback = config.onComplete ?? null;
|
|
166
|
+
this.onTimeoutCallback = config.onTimeout ?? null;
|
|
167
|
+
this.notifyRequestor = config.notifyRequestor ?? false;
|
|
168
|
+
this.checkIntervalMs = config.checkIntervalMs ?? 30000;
|
|
169
|
+
// Start timeout checker if onTimeout callback is provided
|
|
170
|
+
if (this.onTimeoutCallback) {
|
|
171
|
+
this.startTimeoutChecker();
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Submit a new human request via the specified transport
|
|
176
|
+
*/
|
|
177
|
+
async submitRequest(data) {
|
|
178
|
+
// Validate transport is configured
|
|
179
|
+
const transport = this.getTransport(data.transport);
|
|
180
|
+
if (!transport) {
|
|
181
|
+
return {
|
|
182
|
+
success: false,
|
|
183
|
+
error: `Transport '${data.transport}' not configured`,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// Calculate expiration time if timeout specified
|
|
187
|
+
let expiresAt;
|
|
188
|
+
if (data.timeout !== undefined) {
|
|
189
|
+
expiresAt = new Date(Date.now() + data.timeout);
|
|
190
|
+
}
|
|
191
|
+
// Create request in store
|
|
192
|
+
const createData = {
|
|
193
|
+
type: data.type,
|
|
194
|
+
target: data.target,
|
|
195
|
+
content: data.content,
|
|
196
|
+
transport: data.transport,
|
|
197
|
+
};
|
|
198
|
+
if (data.requestedBy !== undefined) {
|
|
199
|
+
createData.requestedBy = data.requestedBy;
|
|
200
|
+
}
|
|
201
|
+
if (data.context !== undefined) {
|
|
202
|
+
createData.context = data.context;
|
|
203
|
+
}
|
|
204
|
+
if (data.notifyChannel !== undefined) {
|
|
205
|
+
createData.notifyChannel = data.notifyChannel;
|
|
206
|
+
}
|
|
207
|
+
if (expiresAt !== undefined) {
|
|
208
|
+
createData.expiresAt = expiresAt;
|
|
209
|
+
}
|
|
210
|
+
const request = await this.store.create(createData);
|
|
211
|
+
// Send via transport
|
|
212
|
+
let deliveryResult;
|
|
213
|
+
try {
|
|
214
|
+
deliveryResult = await this.sendViaTransport(data.transport, transport, request);
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
// Update request status to failed
|
|
218
|
+
await this.store.update(request.id, { status: 'failed' });
|
|
219
|
+
return {
|
|
220
|
+
success: false,
|
|
221
|
+
requestId: request.id,
|
|
222
|
+
error: error instanceof Error ? error.message : String(error),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
if (!deliveryResult.success) {
|
|
226
|
+
// Update request status to failed
|
|
227
|
+
await this.store.update(request.id, { status: 'failed' });
|
|
228
|
+
const errorResult = {
|
|
229
|
+
success: false,
|
|
230
|
+
requestId: request.id,
|
|
231
|
+
};
|
|
232
|
+
if (deliveryResult.error) {
|
|
233
|
+
errorResult.error = deliveryResult.error;
|
|
234
|
+
}
|
|
235
|
+
return errorResult;
|
|
236
|
+
}
|
|
237
|
+
// Update request with external ID
|
|
238
|
+
if (deliveryResult.messageId) {
|
|
239
|
+
await this.store.update(request.id, {
|
|
240
|
+
externalId: deliveryResult.messageId,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
const successResult = {
|
|
244
|
+
success: true,
|
|
245
|
+
requestId: request.id,
|
|
246
|
+
};
|
|
247
|
+
if (deliveryResult.messageId) {
|
|
248
|
+
successResult.externalId = deliveryResult.messageId;
|
|
249
|
+
}
|
|
250
|
+
return successResult;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Handle a webhook callback from a transport
|
|
254
|
+
*/
|
|
255
|
+
async handleWebhook(transport, payload) {
|
|
256
|
+
const { requestId } = payload;
|
|
257
|
+
// Find the request
|
|
258
|
+
const request = await this.store.get(requestId);
|
|
259
|
+
if (!request) {
|
|
260
|
+
return {
|
|
261
|
+
success: false,
|
|
262
|
+
requestId,
|
|
263
|
+
error: `Request '${requestId}' not found`,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
// Check if already completed
|
|
267
|
+
if (request.status !== 'pending') {
|
|
268
|
+
return {
|
|
269
|
+
success: false,
|
|
270
|
+
requestId,
|
|
271
|
+
error: `Request '${requestId}' already completed with status '${request.status}'`,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
// Build result based on payload type
|
|
275
|
+
let result;
|
|
276
|
+
if (payload.type === 'email_reply') {
|
|
277
|
+
// Parse email content for approval/rejection
|
|
278
|
+
const approved = this.parseEmailApproval(payload.content ?? '');
|
|
279
|
+
result = {
|
|
280
|
+
approved,
|
|
281
|
+
via: transport,
|
|
282
|
+
respondedAt: new Date(),
|
|
283
|
+
};
|
|
284
|
+
if (payload.from) {
|
|
285
|
+
result.respondedBy = { id: payload.from };
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
result = {
|
|
290
|
+
respondedAt: new Date(),
|
|
291
|
+
via: transport,
|
|
292
|
+
};
|
|
293
|
+
if (payload.approved !== undefined) {
|
|
294
|
+
result.approved = payload.approved;
|
|
295
|
+
}
|
|
296
|
+
if (payload.answer !== undefined) {
|
|
297
|
+
result.answer = payload.answer;
|
|
298
|
+
}
|
|
299
|
+
if (payload.respondedBy !== undefined) {
|
|
300
|
+
result.respondedBy = payload.respondedBy;
|
|
301
|
+
}
|
|
302
|
+
if (payload.notes !== undefined) {
|
|
303
|
+
result.notes = payload.notes;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// Update the request
|
|
307
|
+
await this.store.update(requestId, {
|
|
308
|
+
status: 'completed',
|
|
309
|
+
result,
|
|
310
|
+
completedAt: new Date(),
|
|
311
|
+
});
|
|
312
|
+
// Notify requestor if configured
|
|
313
|
+
if (this.notifyRequestor && request.notifyChannel) {
|
|
314
|
+
await this.notifyRequestorOfResult(request, result);
|
|
315
|
+
}
|
|
316
|
+
// Call onComplete callback
|
|
317
|
+
if (this.onCompleteCallback) {
|
|
318
|
+
const updatedRequest = await this.store.get(requestId);
|
|
319
|
+
if (updatedRequest) {
|
|
320
|
+
try {
|
|
321
|
+
await this.onCompleteCallback({
|
|
322
|
+
requestId,
|
|
323
|
+
request: updatedRequest,
|
|
324
|
+
result,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
catch {
|
|
328
|
+
// Swallow callback errors
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
return {
|
|
333
|
+
success: true,
|
|
334
|
+
requestId,
|
|
335
|
+
};
|
|
336
|
+
}
|
|
337
|
+
/**
|
|
338
|
+
* Get a request by ID
|
|
339
|
+
*/
|
|
340
|
+
async getRequest(requestId) {
|
|
341
|
+
return this.store.get(requestId);
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Cancel a pending request
|
|
345
|
+
*/
|
|
346
|
+
async cancelRequest(requestId) {
|
|
347
|
+
const request = await this.store.get(requestId);
|
|
348
|
+
if (!request) {
|
|
349
|
+
return {
|
|
350
|
+
success: false,
|
|
351
|
+
error: `Request '${requestId}' not found`,
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
if (request.status !== 'pending') {
|
|
355
|
+
return {
|
|
356
|
+
success: false,
|
|
357
|
+
error: `Request '${requestId}' already completed with status '${request.status}'`,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
await this.store.update(requestId, {
|
|
361
|
+
status: 'cancelled',
|
|
362
|
+
completedAt: new Date(),
|
|
363
|
+
});
|
|
364
|
+
return { success: true };
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Stop the processor and clean up resources
|
|
368
|
+
*/
|
|
369
|
+
destroy() {
|
|
370
|
+
this.destroyed = true;
|
|
371
|
+
if (this.timeoutChecker !== null) {
|
|
372
|
+
clearInterval(this.timeoutChecker);
|
|
373
|
+
this.timeoutChecker = null;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
// ===========================================================================
|
|
377
|
+
// Private Methods
|
|
378
|
+
// ===========================================================================
|
|
379
|
+
getTransport(transport) {
|
|
380
|
+
switch (transport) {
|
|
381
|
+
case 'slack':
|
|
382
|
+
return this.transports.slack;
|
|
383
|
+
case 'email':
|
|
384
|
+
return this.transports.email;
|
|
385
|
+
default:
|
|
386
|
+
return undefined;
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
async sendViaTransport(transportName, transport, request) {
|
|
390
|
+
if (transportName === 'slack') {
|
|
391
|
+
const slackTransport = transport;
|
|
392
|
+
if (request.type === 'approval') {
|
|
393
|
+
const options = { requestId: request.id };
|
|
394
|
+
if (request.context !== undefined) {
|
|
395
|
+
options.context = request.context;
|
|
396
|
+
}
|
|
397
|
+
return slackTransport.sendApprovalRequest(request.target, request.content, options);
|
|
398
|
+
}
|
|
399
|
+
else if (request.type === 'question') {
|
|
400
|
+
return slackTransport.sendQuestion(request.target, request.content, {
|
|
401
|
+
requestId: request.id,
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
else {
|
|
405
|
+
return slackTransport.sendNotification(request.target, request.content);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
if (transportName === 'email') {
|
|
409
|
+
const emailTransport = transport;
|
|
410
|
+
if (request.type === 'approval') {
|
|
411
|
+
const options = {
|
|
412
|
+
to: request.target,
|
|
413
|
+
request: request.content,
|
|
414
|
+
requestId: request.id,
|
|
415
|
+
};
|
|
416
|
+
if (request.context !== undefined) {
|
|
417
|
+
options.context = request.context;
|
|
418
|
+
}
|
|
419
|
+
return emailTransport.sendApprovalRequest(options);
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
return emailTransport.sendNotification({
|
|
423
|
+
to: request.target,
|
|
424
|
+
message: request.content,
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
return {
|
|
429
|
+
success: false,
|
|
430
|
+
transport: transportName,
|
|
431
|
+
error: `Unsupported transport: ${transportName}`,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
parseEmailApproval(content) {
|
|
435
|
+
const lower = content.toLowerCase().trim();
|
|
436
|
+
const approvePatterns = [/^approved/i, /^yes/i, /^lgtm/i, /^ok\b/i];
|
|
437
|
+
for (const pattern of approvePatterns) {
|
|
438
|
+
if (pattern.test(lower)) {
|
|
439
|
+
return true;
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return false;
|
|
443
|
+
}
|
|
444
|
+
async notifyRequestorOfResult(request, result) {
|
|
445
|
+
if (!request.notifyChannel) {
|
|
446
|
+
return;
|
|
447
|
+
}
|
|
448
|
+
// Use Slack if available
|
|
449
|
+
const slackTransport = this.transports.slack;
|
|
450
|
+
if (slackTransport) {
|
|
451
|
+
const status = result.approved ? 'approved' : 'rejected';
|
|
452
|
+
const message = `Your request "${request.content}" was ${status}${result.notes ? `: ${result.notes}` : ''}`;
|
|
453
|
+
await slackTransport.sendNotification(request.notifyChannel, message);
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
startTimeoutChecker() {
|
|
457
|
+
this.timeoutChecker = setInterval(async () => {
|
|
458
|
+
if (this.destroyed) {
|
|
459
|
+
return;
|
|
460
|
+
}
|
|
461
|
+
try {
|
|
462
|
+
const expiredRequests = await this.store.listExpired();
|
|
463
|
+
for (const request of expiredRequests) {
|
|
464
|
+
// Update status to expired
|
|
465
|
+
await this.store.update(request.id, {
|
|
466
|
+
status: 'expired',
|
|
467
|
+
completedAt: new Date(),
|
|
468
|
+
});
|
|
469
|
+
// Call onTimeout callback
|
|
470
|
+
if (this.onTimeoutCallback) {
|
|
471
|
+
try {
|
|
472
|
+
await this.onTimeoutCallback({
|
|
473
|
+
requestId: request.id,
|
|
474
|
+
request,
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
catch {
|
|
478
|
+
// Swallow callback errors
|
|
479
|
+
}
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
catch {
|
|
484
|
+
// Swallow errors in timeout checker
|
|
485
|
+
}
|
|
486
|
+
}, this.checkIntervalMs);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
// =============================================================================
|
|
490
|
+
// Factory Functions
|
|
491
|
+
// =============================================================================
|
|
492
|
+
/**
|
|
493
|
+
* Create a HumanRequestProcessor instance
|
|
494
|
+
*
|
|
495
|
+
* @example
|
|
496
|
+
* ```ts
|
|
497
|
+
* const processor = createHumanRequestProcessor({
|
|
498
|
+
* store: new InMemoryRequestStore(),
|
|
499
|
+
* transports: {
|
|
500
|
+
* slack: createSlackTransport({ botToken, signingSecret }),
|
|
501
|
+
* },
|
|
502
|
+
* onComplete: (data) => console.log('Completed:', data),
|
|
503
|
+
* onTimeout: (data) => console.log('Timed out:', data),
|
|
504
|
+
* })
|
|
505
|
+
* ```
|
|
506
|
+
*/
|
|
507
|
+
export function createHumanRequestProcessor(config) {
|
|
508
|
+
return new HumanRequestProcessor(config);
|
|
509
|
+
}
|
|
510
|
+
//# sourceMappingURL=runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}
|
package/dist/team.d.ts
CHANGED
|
@@ -13,7 +13,8 @@ import type { WorkerTeam } from './types.js';
|
|
|
13
13
|
*
|
|
14
14
|
* @example
|
|
15
15
|
* ```ts
|
|
16
|
-
* const engineeringTeam =
|
|
16
|
+
* const engineeringTeam = defineTeam({
|
|
17
|
+
* id: 'team_eng',
|
|
17
18
|
* name: 'Engineering',
|
|
18
19
|
* description: 'Product engineering team',
|
|
19
20
|
* members: [
|
|
@@ -22,18 +23,20 @@ import type { WorkerTeam } from './types.js';
|
|
|
22
23
|
* { id: 'ai-reviewer', name: 'Code Reviewer', role: 'Code Reviewer', type: 'ai' },
|
|
23
24
|
* { id: 'ai-tester', name: 'Test Generator', role: 'Test Engineer', type: 'ai' },
|
|
24
25
|
* ],
|
|
26
|
+
* contacts: { slack: '#engineering', email: 'eng@company.com' },
|
|
25
27
|
* goals: [
|
|
26
28
|
* 'Ship features on schedule',
|
|
27
29
|
* 'Maintain code quality',
|
|
28
30
|
* 'Reduce technical debt',
|
|
29
31
|
* ],
|
|
30
|
-
* lead: 'alice',
|
|
32
|
+
* lead: { id: 'alice', type: 'human', name: 'Alice' },
|
|
31
33
|
* })
|
|
32
34
|
* ```
|
|
33
35
|
*
|
|
34
36
|
* @example
|
|
35
37
|
* ```ts
|
|
36
|
-
* const supportTeam =
|
|
38
|
+
* const supportTeam = defineTeam({
|
|
39
|
+
* id: 'team_support',
|
|
37
40
|
* name: 'Customer Support',
|
|
38
41
|
* description: '24/7 customer support team',
|
|
39
42
|
* members: [
|
|
@@ -41,21 +44,23 @@ import type { WorkerTeam } from './types.js';
|
|
|
41
44
|
* { id: 'support-ai-2', name: 'Support Bot Beta', role: 'Support Agent', type: 'ai' },
|
|
42
45
|
* { id: 'escalation-human', name: 'Jane', role: 'Senior Support', type: 'human' },
|
|
43
46
|
* ],
|
|
47
|
+
* contacts: { slack: '#support' },
|
|
44
48
|
* goals: [
|
|
45
49
|
* 'Maintain 95% satisfaction rate',
|
|
46
50
|
* 'Response time under 5 minutes',
|
|
47
51
|
* 'First contact resolution > 80%',
|
|
48
52
|
* ],
|
|
49
|
-
* lead: 'escalation-human',
|
|
53
|
+
* lead: { id: 'escalation-human', type: 'human', name: 'Jane' },
|
|
50
54
|
* })
|
|
51
55
|
* ```
|
|
52
56
|
*/
|
|
53
|
-
export declare function
|
|
54
|
-
export declare namespace
|
|
57
|
+
export declare function defineTeam(definition: WorkerTeam): WorkerTeam;
|
|
58
|
+
export declare namespace defineTeam {
|
|
55
59
|
var addMember: (team: WorkerTeam, member: WorkerTeam["members"][number]) => WorkerTeam;
|
|
56
60
|
var removeMember: (team: WorkerTeam, memberId: string) => WorkerTeam;
|
|
57
61
|
var aiMembers: (team: WorkerTeam) => import("./types.js").WorkerRef[];
|
|
58
62
|
var humanMembers: (team: WorkerTeam) => import("./types.js").WorkerRef[];
|
|
59
63
|
var byRole: (team: WorkerTeam, role: string) => import("./types.js").WorkerRef[];
|
|
60
64
|
}
|
|
65
|
+
export { defineTeam as Team };
|
|
61
66
|
//# sourceMappingURL=team.d.ts.map
|
package/dist/team.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"team.d.ts","sourceRoot":"","sources":["../src/team.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"team.d.ts","sourceRoot":"","sources":["../src/team.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAI5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AACH,wBAAgB,UAAU,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAE7D;yBAFe,UAAU;0BAqBI,UAAU,UAAU,UAAU,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,KAAG,UAAU;6BAiB3D,UAAU,YAAY,MAAM,KAAG,UAAU;0BAiB5C,UAAU;6BAcP,UAAU;uBAchB,UAAU,QAAQ,MAAM;;AAGnD,OAAO,EAAE,UAAU,IAAI,IAAI,EAAE,CAAA"}
|