digital-workers 0.1.1 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +17 -0
  3. package/README.md +290 -106
  4. package/dist/actions.d.ts +95 -0
  5. package/dist/actions.d.ts.map +1 -0
  6. package/dist/actions.js +437 -0
  7. package/dist/actions.js.map +1 -0
  8. package/dist/approve.d.ts +49 -0
  9. package/dist/approve.d.ts.map +1 -0
  10. package/dist/approve.js +235 -0
  11. package/dist/approve.js.map +1 -0
  12. package/dist/ask.d.ts +42 -0
  13. package/dist/ask.d.ts.map +1 -0
  14. package/dist/ask.js +227 -0
  15. package/dist/ask.js.map +1 -0
  16. package/dist/decide.d.ts +62 -0
  17. package/dist/decide.d.ts.map +1 -0
  18. package/dist/decide.js +245 -0
  19. package/dist/decide.js.map +1 -0
  20. package/dist/do.d.ts +63 -0
  21. package/dist/do.d.ts.map +1 -0
  22. package/dist/do.js +228 -0
  23. package/dist/do.js.map +1 -0
  24. package/dist/generate.d.ts +61 -0
  25. package/dist/generate.d.ts.map +1 -0
  26. package/dist/generate.js +299 -0
  27. package/dist/generate.js.map +1 -0
  28. package/dist/goals.d.ts +89 -0
  29. package/dist/goals.d.ts.map +1 -0
  30. package/dist/goals.js +206 -0
  31. package/dist/goals.js.map +1 -0
  32. package/dist/index.d.ts +68 -0
  33. package/dist/index.d.ts.map +1 -0
  34. package/dist/index.js +69 -0
  35. package/dist/index.js.map +1 -0
  36. package/dist/is.d.ts +54 -0
  37. package/dist/is.d.ts.map +1 -0
  38. package/dist/is.js +318 -0
  39. package/dist/is.js.map +1 -0
  40. package/dist/kpis.d.ts +103 -0
  41. package/dist/kpis.d.ts.map +1 -0
  42. package/dist/kpis.js +271 -0
  43. package/dist/kpis.js.map +1 -0
  44. package/dist/notify.d.ts +47 -0
  45. package/dist/notify.d.ts.map +1 -0
  46. package/dist/notify.js +220 -0
  47. package/dist/notify.js.map +1 -0
  48. package/dist/role.d.ts +53 -0
  49. package/dist/role.d.ts.map +1 -0
  50. package/dist/role.js +111 -0
  51. package/dist/role.js.map +1 -0
  52. package/dist/team.d.ts +61 -0
  53. package/dist/team.d.ts.map +1 -0
  54. package/dist/team.js +131 -0
  55. package/dist/team.js.map +1 -0
  56. package/dist/transports.d.ts +164 -0
  57. package/dist/transports.d.ts.map +1 -0
  58. package/dist/transports.js +358 -0
  59. package/dist/transports.js.map +1 -0
  60. package/dist/types.d.ts +693 -0
  61. package/dist/types.d.ts.map +1 -0
  62. package/dist/types.js +72 -0
  63. package/dist/types.js.map +1 -0
  64. package/package.json +27 -61
  65. package/src/actions.ts +615 -0
  66. package/src/approve.ts +317 -0
  67. package/src/ask.ts +304 -0
  68. package/src/decide.ts +295 -0
  69. package/src/do.ts +275 -0
  70. package/src/generate.ts +364 -0
  71. package/src/goals.ts +220 -0
  72. package/src/index.ts +118 -0
  73. package/src/is.ts +372 -0
  74. package/src/kpis.ts +348 -0
  75. package/src/notify.ts +303 -0
  76. package/src/role.ts +116 -0
  77. package/src/team.ts +142 -0
  78. package/src/transports.ts +504 -0
  79. package/src/types.ts +843 -0
  80. package/test/actions.test.ts +546 -0
  81. package/test/standalone.test.ts +299 -0
  82. package/test/types.test.ts +460 -0
  83. package/tsconfig.json +9 -0
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ask.js","sourceRoot":"","sources":["../src/ask.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAa7C;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,MAAoB,EACpB,QAAgB,EAChB,UAAsB,EAAE;IAExB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;IAEjD,oDAAoD;IACpD,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC,MAAM,CAAC,CAAA;IAErD,iCAAiC;IACjC,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAA;IAC/D,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAI,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE;QAClE,MAAM;QACN,OAAO;QACP,OAAO;QACP,SAAS;KACV,CAAC,CAAA;IAEF,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,SAAS;QACrB,UAAU,EAAE,IAAI,IAAI,EAAE;QACtB,GAAG,EAAE,OAAO;KACb,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,GAAG,CAAC,EAAE,GAAG,KAAK,EACZ,QAAgB,EAChB,OAAiC,EACjC,MAAqB,EACT,EAAE;IACd,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;YAClC,KAAK,EAAE,QAAQ;YACf,MAAM;YACN,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,OAAO;gBACb,CAAC,CAAC,wDAAwD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;gBAC5F,CAAC,CAAC,SAAS;SACd,CAAC,CAAA;QACF,OAAO,MAAM,CAAC,MAAW,CAAA;IAC3B,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QAClC,KAAK,EAAE,QAAQ;QACf,MAAM,EAAE,EAAE,MAAM,EAAE,4BAA4B,EAAE;QAChD,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,OAAO;YACb,CAAC,CAAC,wDAAwD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE;YAC5F,CAAC,CAAC,SAAS;KACd,CAAC,CAAA;IAEF,OAAQ,MAAM,CAAC,MAAwB,CAAC,MAAM,CAAA;AAChD,CAAC,CAAA;AAED;;;;;;;;;;;GAWG;AACH,GAAG,CAAC,KAAK,GAAG,KAAK,EACf,MAAoB,EACpB,SAAmB,EACnB,UAAsB,EAAE,EACM,EAAE;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAI,MAAM,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAA;AACtE,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,GAAG,CAAC,OAAO,GAAG,KAAK,EACjB,MAAoB,EACpB,KAAa,EACb,UAAsB,EAAE,EACI,EAAE;IAC9B,OAAO,GAAG,CAAS,MAAM,EAAE,oBAAoB,KAAK,EAAE,EAAE,OAAO,CAAC,CAAA;AAClE,CAAC,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,GAAG,CAAC,KAAK,GAAG,KAAK,EACf,MAAoB,EACpB,QAAgB,EAChB,UAAsB,EAAE,EACU,EAAE;IACpC,OAAO,GAAG,CAAe,MAAM,EAAE,QAAQ,EAAE;QACzC,GAAG,OAAO;QACV,MAAM,EAAE;YACN,MAAM,EAAE,mBAAmB;SAC5B;KACF,CAAC,CAAA;AACJ,CAAC,CAAA;AAED;;;;;;;;;;GAUG;AACH,GAAG,CAAC,MAAM,GAAG,KAAK,EAChB,MAAoB,EACpB,QAAgB,EAChB,OAAY,EACZ,UAAsB,EAAE,EACD,EAAE;IACzB,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACrE,MAAM,YAAY,GAAG,GAAG,QAAQ,iBAAiB,UAAU,EAAE,CAAA;IAE7D,OAAO,GAAG,CAAI,MAAM,EAAE,YAAY,EAAE;QAClC,GAAG,OAAO;QACV,MAAM,EAAE;YACN,MAAM,EAAE,WAAW,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACxC;KACF,CAAC,CAAA;AACJ,CAAC,CAAA;AAED,+EAA+E;AAC/E,mBAAmB;AACnB,+EAA+E;AAE/E;;GAEG;AACH,SAAS,aAAa,CAAC,MAAoB;IAIzC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE;SAC1B,CAAA;IACH,CAAC;IAED,IAAI,UAAU,IAAI,MAAM,EAAE,CAAC;QACzB,iBAAiB;QACjB,IAAI,SAAoB,CAAA;QACxB,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;YACxB,kCAAkC;YAClC,SAAS,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,CAAA;QACnE,CAAC;aAAM,CAAC;YACN,SAAS;YACT,SAAS,GAAG,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAA;QACrE,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS;SACV,CAAA;IACH,CAAC;IAED,YAAY;IACZ,OAAO;QACL,QAAQ,EAAE,EAAE;QACZ,SAAS,EAAE,MAAM;KAClB,CAAA;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,GAAkD,EAClD,QAAkB;IAElB,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;QACnD,IAAI,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;YACnD,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAqB,CAAA;IAC3D,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;IAC1B,OAAO,KAAK,IAAI,IAAI,CAAA;AACtB,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,OAAuB,EACvB,QAAgB,EAChB,QAAkB,EAClB,OAKC;IAED,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAA;IAEjC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,MAAM,OAAO,qBAAqB,CAAC,CAAA;IACrD,CAAC;IAED,wCAAwC;IACxC,yCAAyC;IACzC,kCAAkC;IAClC,gDAAgD;IAChD,qCAAqC;IAErC,uCAAuC;IACvC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAA;IAEvD,kEAAkE;IAClE,OAAO;QACL,MAAM,EAAE,yBAA8B;KACvC,CAAA;AACH,CAAC"}
@@ -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"}