digital-workers 0.1.1 → 2.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.
- package/.turbo/turbo-build.log +5 -0
- package/CHANGELOG.md +9 -0
- package/README.md +290 -106
- package/dist/actions.d.ts +95 -0
- package/dist/actions.d.ts.map +1 -0
- package/dist/actions.js +437 -0
- package/dist/actions.js.map +1 -0
- package/dist/approve.d.ts +49 -0
- package/dist/approve.d.ts.map +1 -0
- package/dist/approve.js +235 -0
- package/dist/approve.js.map +1 -0
- package/dist/ask.d.ts +42 -0
- package/dist/ask.d.ts.map +1 -0
- package/dist/ask.js +227 -0
- package/dist/ask.js.map +1 -0
- package/dist/decide.d.ts +62 -0
- package/dist/decide.d.ts.map +1 -0
- package/dist/decide.js +245 -0
- package/dist/decide.js.map +1 -0
- package/dist/do.d.ts +63 -0
- package/dist/do.d.ts.map +1 -0
- package/dist/do.js +228 -0
- package/dist/do.js.map +1 -0
- package/dist/generate.d.ts +61 -0
- package/dist/generate.d.ts.map +1 -0
- package/dist/generate.js +299 -0
- package/dist/generate.js.map +1 -0
- package/dist/goals.d.ts +89 -0
- package/dist/goals.d.ts.map +1 -0
- package/dist/goals.js +206 -0
- package/dist/goals.js.map +1 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +69 -0
- package/dist/index.js.map +1 -0
- package/dist/is.d.ts +54 -0
- package/dist/is.d.ts.map +1 -0
- package/dist/is.js +318 -0
- package/dist/is.js.map +1 -0
- package/dist/kpis.d.ts +103 -0
- package/dist/kpis.d.ts.map +1 -0
- package/dist/kpis.js +271 -0
- package/dist/kpis.js.map +1 -0
- package/dist/notify.d.ts +47 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +220 -0
- package/dist/notify.js.map +1 -0
- package/dist/role.d.ts +53 -0
- package/dist/role.d.ts.map +1 -0
- package/dist/role.js +111 -0
- package/dist/role.js.map +1 -0
- package/dist/team.d.ts +61 -0
- package/dist/team.d.ts.map +1 -0
- package/dist/team.js +131 -0
- package/dist/team.js.map +1 -0
- package/dist/transports.d.ts +164 -0
- package/dist/transports.d.ts.map +1 -0
- package/dist/transports.js +358 -0
- package/dist/transports.js.map +1 -0
- package/dist/types.d.ts +693 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +72 -0
- package/dist/types.js.map +1 -0
- package/package.json +27 -61
- package/src/actions.ts +615 -0
- package/src/approve.ts +317 -0
- package/src/ask.ts +304 -0
- package/src/decide.ts +295 -0
- package/src/do.ts +275 -0
- package/src/generate.ts +364 -0
- package/src/goals.ts +220 -0
- package/src/index.ts +118 -0
- package/src/is.ts +372 -0
- package/src/kpis.ts +348 -0
- package/src/notify.ts +303 -0
- package/src/role.ts +116 -0
- package/src/team.ts +142 -0
- package/src/transports.ts +504 -0
- package/src/types.ts +843 -0
- package/test/actions.test.ts +546 -0
- package/test/standalone.test.ts +299 -0
- package/test/types.test.ts +460 -0
- package/tsconfig.json +9 -0
package/dist/approve.js
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Approval request functionality for digital workers
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Request approval from a worker or team
|
|
6
|
+
*
|
|
7
|
+
* Routes approval requests through the specified channel and waits for a response.
|
|
8
|
+
*
|
|
9
|
+
* @param request - What is being requested for approval
|
|
10
|
+
* @param target - The worker or team to request approval from
|
|
11
|
+
* @param options - Approval options
|
|
12
|
+
* @returns Promise resolving to approval result
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* // Request approval from a worker
|
|
17
|
+
* const result = await approve('Expense: $500 for AWS', manager, {
|
|
18
|
+
* via: 'slack',
|
|
19
|
+
* context: { amount: 500, category: 'Infrastructure' },
|
|
20
|
+
* })
|
|
21
|
+
*
|
|
22
|
+
* if (result.approved) {
|
|
23
|
+
* console.log(`Approved by ${result.approvedBy?.name}`)
|
|
24
|
+
* }
|
|
25
|
+
*
|
|
26
|
+
* // Request approval from a team
|
|
27
|
+
* const result = await approve('Deploy v2.1.0 to production', opsTeam, {
|
|
28
|
+
* via: 'slack',
|
|
29
|
+
* })
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export async function approve(request, target, options = {}) {
|
|
33
|
+
const { via, timeout, context, escalate = false } = options;
|
|
34
|
+
// Resolve target to get contacts and approver info
|
|
35
|
+
const { contacts, approver } = resolveTarget(target);
|
|
36
|
+
// Determine which channel to use
|
|
37
|
+
const channel = resolveChannel(via, contacts);
|
|
38
|
+
if (!channel) {
|
|
39
|
+
throw new Error('No valid channel available for approval request');
|
|
40
|
+
}
|
|
41
|
+
// Send the approval request and wait for response
|
|
42
|
+
const response = await sendApprovalRequest(channel, request, contacts, {
|
|
43
|
+
timeout,
|
|
44
|
+
context,
|
|
45
|
+
approver,
|
|
46
|
+
escalate,
|
|
47
|
+
});
|
|
48
|
+
return {
|
|
49
|
+
approved: response.approved,
|
|
50
|
+
approvedBy: approver,
|
|
51
|
+
approvedAt: new Date(),
|
|
52
|
+
notes: response.notes,
|
|
53
|
+
via: channel,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Request approval with structured decision context
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* const result = await approve.withContext(
|
|
62
|
+
* 'Migrate to new database',
|
|
63
|
+
* cto,
|
|
64
|
+
* {
|
|
65
|
+
* pros: ['Better performance', 'Lower cost'],
|
|
66
|
+
* cons: ['Migration effort', 'Downtime required'],
|
|
67
|
+
* risks: ['Data loss', 'Service disruption'],
|
|
68
|
+
* mitigations: ['Backup strategy', 'Staged rollout'],
|
|
69
|
+
* },
|
|
70
|
+
* { via: 'email' }
|
|
71
|
+
* )
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
approve.withContext = async (request, target, decision, options = {}) => {
|
|
75
|
+
return approve(request, target, {
|
|
76
|
+
...options,
|
|
77
|
+
context: {
|
|
78
|
+
...options.context,
|
|
79
|
+
decision,
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
/**
|
|
84
|
+
* Request batch approval for multiple items
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```ts
|
|
88
|
+
* const results = await approve.batch([
|
|
89
|
+
* 'Expense: $500 for AWS',
|
|
90
|
+
* 'Expense: $200 for office supplies',
|
|
91
|
+
* 'Expense: $1000 for conference ticket',
|
|
92
|
+
* ], finance, { via: 'email' })
|
|
93
|
+
*
|
|
94
|
+
* const approved = results.filter(r => r.approved)
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
approve.batch = async (requests, target, options = {}) => {
|
|
98
|
+
return Promise.all(requests.map((request) => approve(request, target, options)));
|
|
99
|
+
};
|
|
100
|
+
/**
|
|
101
|
+
* Request approval with a deadline
|
|
102
|
+
*
|
|
103
|
+
* @example
|
|
104
|
+
* ```ts
|
|
105
|
+
* const result = await approve.withDeadline(
|
|
106
|
+
* 'Release v2.0',
|
|
107
|
+
* manager,
|
|
108
|
+
* new Date('2024-01-15T17:00:00Z'),
|
|
109
|
+
* { via: 'slack' }
|
|
110
|
+
* )
|
|
111
|
+
* ```
|
|
112
|
+
*/
|
|
113
|
+
approve.withDeadline = async (request, target, deadline, options = {}) => {
|
|
114
|
+
const timeout = deadline.getTime() - Date.now();
|
|
115
|
+
return approve(request, target, {
|
|
116
|
+
...options,
|
|
117
|
+
timeout: Math.max(0, timeout),
|
|
118
|
+
context: {
|
|
119
|
+
...options.context,
|
|
120
|
+
deadline: deadline.toISOString(),
|
|
121
|
+
},
|
|
122
|
+
});
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* Request approval from multiple approvers (any one can approve)
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```ts
|
|
129
|
+
* const result = await approve.any(
|
|
130
|
+
* 'Urgent: Production fix',
|
|
131
|
+
* [alice, bob, charlie],
|
|
132
|
+
* { via: 'slack' }
|
|
133
|
+
* )
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
approve.any = async (request, targets, options = {}) => {
|
|
137
|
+
// Race all approval requests - first to respond wins
|
|
138
|
+
return Promise.race(targets.map((target) => approve(request, target, options)));
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Request approval from multiple approvers (all must approve)
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```ts
|
|
145
|
+
* const result = await approve.all(
|
|
146
|
+
* 'Major infrastructure change',
|
|
147
|
+
* [cto, vpe, securityLead],
|
|
148
|
+
* { via: 'email' }
|
|
149
|
+
* )
|
|
150
|
+
* ```
|
|
151
|
+
*/
|
|
152
|
+
approve.all = async (request, targets, options = {}) => {
|
|
153
|
+
const results = await Promise.all(targets.map((target) => approve(request, target, options)));
|
|
154
|
+
const allApproved = results.every((r) => r.approved);
|
|
155
|
+
return {
|
|
156
|
+
approved: allApproved,
|
|
157
|
+
approvedAt: new Date(),
|
|
158
|
+
notes: allApproved
|
|
159
|
+
? 'All approvers approved'
|
|
160
|
+
: `${results.filter((r) => !r.approved).length} rejection(s)`,
|
|
161
|
+
approvals: results,
|
|
162
|
+
};
|
|
163
|
+
};
|
|
164
|
+
// ============================================================================
|
|
165
|
+
// Internal Helpers
|
|
166
|
+
// ============================================================================
|
|
167
|
+
/**
|
|
168
|
+
* Resolve an action target to contacts and approver
|
|
169
|
+
*/
|
|
170
|
+
function resolveTarget(target) {
|
|
171
|
+
if (typeof target === 'string') {
|
|
172
|
+
return {
|
|
173
|
+
contacts: {},
|
|
174
|
+
approver: { id: target },
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
if ('contacts' in target) {
|
|
178
|
+
// Worker or Team
|
|
179
|
+
let approver;
|
|
180
|
+
if ('members' in target) {
|
|
181
|
+
// Team - use lead or first member
|
|
182
|
+
approver = target.lead ?? target.members[0] ?? { id: target.id };
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// Worker
|
|
186
|
+
approver = { id: target.id, type: target.type, name: target.name };
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
contacts: target.contacts,
|
|
190
|
+
approver,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// WorkerRef
|
|
194
|
+
return {
|
|
195
|
+
contacts: {},
|
|
196
|
+
approver: target,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Determine which channel to use
|
|
201
|
+
*/
|
|
202
|
+
function resolveChannel(via, contacts) {
|
|
203
|
+
if (via) {
|
|
204
|
+
const requested = Array.isArray(via) ? via[0] : via;
|
|
205
|
+
if (requested && contacts[requested] !== undefined) {
|
|
206
|
+
return requested;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// Default to first available
|
|
210
|
+
const available = Object.keys(contacts);
|
|
211
|
+
const first = available[0];
|
|
212
|
+
return first ?? null;
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Send an approval request to a channel and wait for response
|
|
216
|
+
*/
|
|
217
|
+
async function sendApprovalRequest(channel, request, contacts, options) {
|
|
218
|
+
const contact = contacts[channel];
|
|
219
|
+
if (!contact) {
|
|
220
|
+
throw new Error(`No ${channel} contact configured`);
|
|
221
|
+
}
|
|
222
|
+
// In a real implementation, this would:
|
|
223
|
+
// 1. Format the request for the channel (Slack blocks, email HTML, etc.)
|
|
224
|
+
// 2. Send via the appropriate API
|
|
225
|
+
// 3. Wait for response (polling, webhook, interactive message, etc.)
|
|
226
|
+
// 4. Handle timeout and escalation
|
|
227
|
+
// For now, simulate a pending response
|
|
228
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
229
|
+
// Return a placeholder - real impl would wait for actual response
|
|
230
|
+
return {
|
|
231
|
+
approved: false,
|
|
232
|
+
notes: 'Approval pending - waiting for response',
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=approve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"approve.js","sourceRoot":"","sources":["../src/approve.ts"],"names":[],"mappings":"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"}
|
package/dist/ask.d.ts
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Question/answer functionality for digital workers
|
|
3
|
+
*/
|
|
4
|
+
import type { SimpleSchema } from 'ai-functions';
|
|
5
|
+
import type { ActionTarget, AskResult, AskOptions } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Ask a question to a worker or team
|
|
8
|
+
*
|
|
9
|
+
* Routes questions through the specified channel and waits for a response.
|
|
10
|
+
*
|
|
11
|
+
* @param target - The worker or team to ask
|
|
12
|
+
* @param question - The question to ask
|
|
13
|
+
* @param options - Ask options
|
|
14
|
+
* @returns Promise resolving to the answer
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* // Ask a simple question
|
|
19
|
+
* const result = await ask(alice, 'What is the company holiday policy?', {
|
|
20
|
+
* via: 'slack',
|
|
21
|
+
* })
|
|
22
|
+
* console.log(result.answer)
|
|
23
|
+
*
|
|
24
|
+
* // Ask with structured response
|
|
25
|
+
* const result = await ask(ceo, 'What are our Q1 priorities?', {
|
|
26
|
+
* via: 'email',
|
|
27
|
+
* schema: {
|
|
28
|
+
* priorities: ['List of priorities'],
|
|
29
|
+
* reasoning: 'Why these priorities were chosen',
|
|
30
|
+
* },
|
|
31
|
+
* })
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function ask<T = string>(target: ActionTarget, question: string, options?: AskOptions): Promise<AskResult<T>>;
|
|
35
|
+
export declare namespace ask {
|
|
36
|
+
var ai: <T = string>(question: string, context?: Record<string, unknown>, schema?: SimpleSchema) => Promise<T>;
|
|
37
|
+
var batch: <T = string>(target: ActionTarget, questions: string[], options?: AskOptions) => Promise<Array<AskResult<T>>>;
|
|
38
|
+
var clarify: (target: ActionTarget, topic: string, options?: AskOptions) => Promise<AskResult<string>>;
|
|
39
|
+
var yesNo: (target: ActionTarget, question: string, options?: AskOptions) => Promise<AskResult<"yes" | "no">>;
|
|
40
|
+
var choose: <T extends string>(target: ActionTarget, question: string, choices: T[], options?: AskOptions) => Promise<AskResult<T>>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=ask.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.d.ts","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAChD,OAAO,KAAK,EAIV,YAAY,EAEZ,SAAS,EACT,UAAU,EAEX,MAAM,YAAY,CAAA;AAEnB;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,GAAG,CAAC,CAAC,GAAG,MAAM,EAClC,MAAM,EAAE,YAAY,EACpB,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CA2BvB;yBA/BqB,GAAG;aA4CT,CAAC,qBACL,MAAM,YACN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,WACxB,YAAY,KACpB,OAAO,CAAC,CAAC,CAAC;gBAqCM,CAAC,mBACV,YAAY,aACT,MAAM,EAAE,YACV,UAAU,KAClB,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;0BAarB,YAAY,SACb,MAAM,YACJ,UAAU,KAClB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;wBAkBnB,YAAY,YACV,MAAM,YACP,UAAU,KAClB,OAAO,CAAC,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;iBAoBf,CAAC,SAAS,MAAM,UAC1B,YAAY,YACV,MAAM,WACP,CAAC,EAAE,YACH,UAAU,KAClB,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/ask.js
ADDED
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Question/answer functionality for digital workers
|
|
3
|
+
*/
|
|
4
|
+
import { generateObject } from 'ai-functions';
|
|
5
|
+
/**
|
|
6
|
+
* Ask a question to a worker or team
|
|
7
|
+
*
|
|
8
|
+
* Routes questions through the specified channel and waits for a response.
|
|
9
|
+
*
|
|
10
|
+
* @param target - The worker or team to ask
|
|
11
|
+
* @param question - The question to ask
|
|
12
|
+
* @param options - Ask options
|
|
13
|
+
* @returns Promise resolving to the answer
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* // Ask a simple question
|
|
18
|
+
* const result = await ask(alice, 'What is the company holiday policy?', {
|
|
19
|
+
* via: 'slack',
|
|
20
|
+
* })
|
|
21
|
+
* console.log(result.answer)
|
|
22
|
+
*
|
|
23
|
+
* // Ask with structured response
|
|
24
|
+
* const result = await ask(ceo, 'What are our Q1 priorities?', {
|
|
25
|
+
* via: 'email',
|
|
26
|
+
* schema: {
|
|
27
|
+
* priorities: ['List of priorities'],
|
|
28
|
+
* reasoning: 'Why these priorities were chosen',
|
|
29
|
+
* },
|
|
30
|
+
* })
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export async function ask(target, question, options = {}) {
|
|
34
|
+
const { via, schema, timeout, context } = options;
|
|
35
|
+
// Resolve target to get contacts and recipient info
|
|
36
|
+
const { contacts, recipient } = resolveTarget(target);
|
|
37
|
+
// Determine which channel to use
|
|
38
|
+
const channel = resolveChannel(via, contacts);
|
|
39
|
+
if (!channel) {
|
|
40
|
+
throw new Error('No valid channel available to ask question');
|
|
41
|
+
}
|
|
42
|
+
// Send the question and wait for response
|
|
43
|
+
const response = await sendQuestion(channel, question, contacts, {
|
|
44
|
+
schema,
|
|
45
|
+
timeout,
|
|
46
|
+
context,
|
|
47
|
+
recipient,
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
answer: response.answer,
|
|
51
|
+
answeredBy: recipient,
|
|
52
|
+
answeredAt: new Date(),
|
|
53
|
+
via: channel,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Ask an AI agent directly (no human routing)
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* ```ts
|
|
61
|
+
* const answer = await ask.ai('What is our refund policy?', {
|
|
62
|
+
* policies: [...],
|
|
63
|
+
* customerContext: {...},
|
|
64
|
+
* })
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
ask.ai = async (question, context, schema) => {
|
|
68
|
+
if (schema) {
|
|
69
|
+
const result = await generateObject({
|
|
70
|
+
model: 'sonnet',
|
|
71
|
+
schema,
|
|
72
|
+
prompt: question,
|
|
73
|
+
system: context
|
|
74
|
+
? `Use the following context to answer the question:\n\n${JSON.stringify(context, null, 2)}`
|
|
75
|
+
: undefined,
|
|
76
|
+
});
|
|
77
|
+
return result.object;
|
|
78
|
+
}
|
|
79
|
+
const result = await generateObject({
|
|
80
|
+
model: 'sonnet',
|
|
81
|
+
schema: { answer: 'The answer to the question' },
|
|
82
|
+
prompt: question,
|
|
83
|
+
system: context
|
|
84
|
+
? `Use the following context to answer the question:\n\n${JSON.stringify(context, null, 2)}`
|
|
85
|
+
: undefined,
|
|
86
|
+
});
|
|
87
|
+
return result.object.answer;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Ask multiple questions at once
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```ts
|
|
94
|
+
* const results = await ask.batch(hr, [
|
|
95
|
+
* 'What is the vacation policy?',
|
|
96
|
+
* 'What is the remote work policy?',
|
|
97
|
+
* 'What is the expense policy?',
|
|
98
|
+
* ], { via: 'email' })
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
ask.batch = async (target, questions, options = {}) => {
|
|
102
|
+
return Promise.all(questions.map((q) => ask(target, q, options)));
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* Ask for clarification on something
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```ts
|
|
109
|
+
* const clarification = await ask.clarify(devops, 'The deployment process')
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
ask.clarify = async (target, topic, options = {}) => {
|
|
113
|
+
return ask(target, `Can you clarify: ${topic}`, options);
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Ask a yes/no question
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```ts
|
|
120
|
+
* const result = await ask.yesNo(manager, 'Should we proceed with the release?', {
|
|
121
|
+
* via: 'slack',
|
|
122
|
+
* })
|
|
123
|
+
* if (result.answer === 'yes') {
|
|
124
|
+
* // proceed
|
|
125
|
+
* }
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
128
|
+
ask.yesNo = async (target, question, options = {}) => {
|
|
129
|
+
return ask(target, question, {
|
|
130
|
+
...options,
|
|
131
|
+
schema: {
|
|
132
|
+
answer: 'Answer: yes or no',
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
};
|
|
136
|
+
/**
|
|
137
|
+
* Ask for a choice from options
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* ```ts
|
|
141
|
+
* const result = await ask.choose(designer, 'Which color scheme?', {
|
|
142
|
+
* choices: ['Light', 'Dark', 'System'],
|
|
143
|
+
* via: 'slack',
|
|
144
|
+
* })
|
|
145
|
+
* ```
|
|
146
|
+
*/
|
|
147
|
+
ask.choose = async (target, question, choices, options = {}) => {
|
|
148
|
+
const choiceList = choices.map((c, i) => `${i + 1}. ${c}`).join('\n');
|
|
149
|
+
const fullQuestion = `${question}\n\nOptions:\n${choiceList}`;
|
|
150
|
+
return ask(target, fullQuestion, {
|
|
151
|
+
...options,
|
|
152
|
+
schema: {
|
|
153
|
+
answer: `One of: ${choices.join(', ')}`,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
// ============================================================================
|
|
158
|
+
// Internal Helpers
|
|
159
|
+
// ============================================================================
|
|
160
|
+
/**
|
|
161
|
+
* Resolve an action target to contacts and recipient
|
|
162
|
+
*/
|
|
163
|
+
function resolveTarget(target) {
|
|
164
|
+
if (typeof target === 'string') {
|
|
165
|
+
return {
|
|
166
|
+
contacts: {},
|
|
167
|
+
recipient: { id: target },
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
if ('contacts' in target) {
|
|
171
|
+
// Worker or Team
|
|
172
|
+
let recipient;
|
|
173
|
+
if ('members' in target) {
|
|
174
|
+
// Team - ask lead or first member
|
|
175
|
+
recipient = target.lead ?? target.members[0] ?? { id: target.id };
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
// Worker
|
|
179
|
+
recipient = { id: target.id, type: target.type, name: target.name };
|
|
180
|
+
}
|
|
181
|
+
return {
|
|
182
|
+
contacts: target.contacts,
|
|
183
|
+
recipient,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
// WorkerRef
|
|
187
|
+
return {
|
|
188
|
+
contacts: {},
|
|
189
|
+
recipient: target,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Determine which channel to use
|
|
194
|
+
*/
|
|
195
|
+
function resolveChannel(via, contacts) {
|
|
196
|
+
if (via) {
|
|
197
|
+
const requested = Array.isArray(via) ? via[0] : via;
|
|
198
|
+
if (requested && contacts[requested] !== undefined) {
|
|
199
|
+
return requested;
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
// Default to first available
|
|
203
|
+
const available = Object.keys(contacts);
|
|
204
|
+
const first = available[0];
|
|
205
|
+
return first ?? null;
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Send a question to a channel and wait for response
|
|
209
|
+
*/
|
|
210
|
+
async function sendQuestion(channel, question, contacts, options) {
|
|
211
|
+
const contact = contacts[channel];
|
|
212
|
+
if (!contact) {
|
|
213
|
+
throw new Error(`No ${channel} contact configured`);
|
|
214
|
+
}
|
|
215
|
+
// In a real implementation, this would:
|
|
216
|
+
// 1. Format the question for the channel
|
|
217
|
+
// 2. Send via the appropriate API
|
|
218
|
+
// 3. Wait for response (polling, webhook, etc.)
|
|
219
|
+
// 4. Parse and validate the response
|
|
220
|
+
// For now, simulate a pending response
|
|
221
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
222
|
+
// Return a placeholder - real impl would wait for actual response
|
|
223
|
+
return {
|
|
224
|
+
answer: 'Waiting for response...',
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=ask.js.map
|
package/dist/ask.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"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"}
|
package/dist/decide.d.ts
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Decision-making functionality for digital workers
|
|
3
|
+
*/
|
|
4
|
+
import type { Decision, DecideOptions } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Make a decision from a set of options
|
|
7
|
+
*
|
|
8
|
+
* Uses AI to evaluate options and make a reasoned decision,
|
|
9
|
+
* or can route to human decision-makers for critical choices.
|
|
10
|
+
*
|
|
11
|
+
* @param options - Decision options with configuration
|
|
12
|
+
* @returns Promise resolving to decision result
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const decision = await decide({
|
|
17
|
+
* options: ['Option A', 'Option B', 'Option C'],
|
|
18
|
+
* context: 'We need to choose a technology stack for our new project',
|
|
19
|
+
* criteria: [
|
|
20
|
+
* 'Developer experience',
|
|
21
|
+
* 'Performance',
|
|
22
|
+
* 'Community support',
|
|
23
|
+
* 'Long-term viability',
|
|
24
|
+
* ],
|
|
25
|
+
* })
|
|
26
|
+
*
|
|
27
|
+
* console.log(`Decision: ${decision.choice}`)
|
|
28
|
+
* console.log(`Reasoning: ${decision.reasoning}`)
|
|
29
|
+
* console.log(`Confidence: ${decision.confidence}`)
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @example
|
|
33
|
+
* ```ts
|
|
34
|
+
* // Complex decision with structured options
|
|
35
|
+
* const decision = await decide({
|
|
36
|
+
* options: [
|
|
37
|
+
* { id: 'migrate', label: 'Migrate to new platform' },
|
|
38
|
+
* { id: 'refactor', label: 'Refactor existing system' },
|
|
39
|
+
* { id: 'rebuild', label: 'Rebuild from scratch' },
|
|
40
|
+
* ],
|
|
41
|
+
* context: {
|
|
42
|
+
* budget: '$500k',
|
|
43
|
+
* timeline: '6 months',
|
|
44
|
+
* teamSize: 5,
|
|
45
|
+
* currentSystem: 'Legacy monolith',
|
|
46
|
+
* },
|
|
47
|
+
* criteria: ['Cost', 'Time to market', 'Risk', 'Scalability'],
|
|
48
|
+
* })
|
|
49
|
+
* ```
|
|
50
|
+
*/
|
|
51
|
+
export declare function decide<T = string>(options: DecideOptions<T>): Promise<Decision<T>>;
|
|
52
|
+
export declare namespace decide {
|
|
53
|
+
var yesNo: (question: string, context?: string | Record<string, unknown>) => Promise<Decision<"yes" | "no">>;
|
|
54
|
+
var prioritize: <T = string>(items: T[], context?: string | Record<string, unknown>, criteria?: string[]) => Promise<Array<Decision<T> & {
|
|
55
|
+
rank: number;
|
|
56
|
+
}>>;
|
|
57
|
+
var withApproval: <T = string>(options: DecideOptions<T>, approver: string) => Promise<Decision<T> & {
|
|
58
|
+
approved: boolean;
|
|
59
|
+
approvedBy?: string;
|
|
60
|
+
}>;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=decide.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decide.d.ts","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AACH,wBAAsB,MAAM,CAAC,CAAC,GAAG,MAAM,EACrC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,GACxB,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAyEtB;yBA3EqB,MAAM;0BAqGhB,MAAM,YACN,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;qBA8BP,CAAC,kBACnB,CAAC,EAAE,YACA,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,aAChC,MAAM,EAAE,KACjB,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;uBA6EpB,CAAC,oBACnB,aAAa,CAAC,CAAC,CAAC,YACf,MAAM,KACf,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG;QAAE,QAAQ,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC"}
|