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/src/kpis.ts
CHANGED
|
@@ -2,11 +2,20 @@
|
|
|
2
2
|
* KPI and OKR tracking functionality for digital workers
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type { KPI, OKR } from '
|
|
5
|
+
import type { KPI, OKR, KeyResult } from 'org.ai'
|
|
6
|
+
import { calculateProgress, isOnTrack, calculateGap } from 'org.ai'
|
|
7
|
+
import type { WorkerKPI, WorkerOKR } from './types.js'
|
|
8
|
+
|
|
9
|
+
// Re-export KPI, OKR from org.ai for convenience
|
|
10
|
+
export type { KPI, OKR, KeyResult } from 'org.ai'
|
|
6
11
|
|
|
7
12
|
/**
|
|
8
13
|
* Define and track Key Performance Indicators
|
|
9
14
|
*
|
|
15
|
+
* Uses WorkerKPI which has a simpler interface with `current` and `target`
|
|
16
|
+
* as required number fields. For the full org.ai KPI with `id`, `value`,
|
|
17
|
+
* `category`, and `history`, use the KPI type directly.
|
|
18
|
+
*
|
|
10
19
|
* @param definition - KPI definition or array of KPIs
|
|
11
20
|
* @returns The defined KPI(s)
|
|
12
21
|
*
|
|
@@ -46,9 +55,9 @@ import type { KPI, OKR } from './types.js'
|
|
|
46
55
|
* ])
|
|
47
56
|
* ```
|
|
48
57
|
*/
|
|
49
|
-
export function kpis(definition:
|
|
50
|
-
export function kpis(definition:
|
|
51
|
-
export function kpis(definition:
|
|
58
|
+
export function kpis(definition: WorkerKPI): WorkerKPI
|
|
59
|
+
export function kpis(definition: WorkerKPI[]): WorkerKPI[]
|
|
60
|
+
export function kpis(definition: WorkerKPI | WorkerKPI[]): WorkerKPI | WorkerKPI[] {
|
|
52
61
|
return definition
|
|
53
62
|
}
|
|
54
63
|
|
|
@@ -66,9 +75,9 @@ export function kpis(definition: KPI | KPI[]): KPI | KPI[] {
|
|
|
66
75
|
* console.log(updated.trend) // 'up' (automatically determined)
|
|
67
76
|
* ```
|
|
68
77
|
*/
|
|
69
|
-
kpis.update = (kpi:
|
|
78
|
+
kpis.update = (kpi: WorkerKPI, current: number): WorkerKPI => {
|
|
70
79
|
// Determine trend
|
|
71
|
-
let trend:
|
|
80
|
+
let trend: WorkerKPI['trend'] = 'stable'
|
|
72
81
|
if (current > kpi.current) {
|
|
73
82
|
trend = 'up'
|
|
74
83
|
} else if (current < kpi.current) {
|
|
@@ -94,9 +103,8 @@ kpis.update = (kpi: KPI, current: number): KPI => {
|
|
|
94
103
|
* const progress = kpis.progress(kpi) // 0.75
|
|
95
104
|
* ```
|
|
96
105
|
*/
|
|
97
|
-
kpis.progress = (kpi: Pick<
|
|
98
|
-
|
|
99
|
-
return Math.min(1, Math.max(0, kpi.current / kpi.target))
|
|
106
|
+
kpis.progress = (kpi: Pick<WorkerKPI, 'current' | 'target'>): number => {
|
|
107
|
+
return calculateProgress(kpi)
|
|
100
108
|
}
|
|
101
109
|
|
|
102
110
|
/**
|
|
@@ -112,8 +120,8 @@ kpis.progress = (kpi: Pick<KPI, 'current' | 'target'>): number => {
|
|
|
112
120
|
* const onTrack = kpis.onTrack(kpi) // true (85% >= 80%)
|
|
113
121
|
* ```
|
|
114
122
|
*/
|
|
115
|
-
kpis.onTrack = (kpi: Pick<
|
|
116
|
-
return
|
|
123
|
+
kpis.onTrack = (kpi: Pick<WorkerKPI, 'current' | 'target'>, threshold = 0.8): boolean => {
|
|
124
|
+
return isOnTrack(kpi, threshold)
|
|
117
125
|
}
|
|
118
126
|
|
|
119
127
|
/**
|
|
@@ -128,8 +136,8 @@ kpis.onTrack = (kpi: Pick<KPI, 'current' | 'target'>, threshold = 0.8): boolean
|
|
|
128
136
|
* const gap = kpis.gap(kpi) // 25
|
|
129
137
|
* ```
|
|
130
138
|
*/
|
|
131
|
-
kpis.gap = (kpi: Pick<
|
|
132
|
-
return kpi
|
|
139
|
+
kpis.gap = (kpi: Pick<WorkerKPI, 'current' | 'target'>): number => {
|
|
140
|
+
return calculateGap(kpi)
|
|
133
141
|
}
|
|
134
142
|
|
|
135
143
|
/**
|
|
@@ -151,7 +159,7 @@ kpis.gap = (kpi: Pick<KPI, 'current' | 'target'>): number => {
|
|
|
151
159
|
* // "Deployment Frequency: 5/10 deploys/week (50%, trending up)"
|
|
152
160
|
* ```
|
|
153
161
|
*/
|
|
154
|
-
kpis.format = (kpi:
|
|
162
|
+
kpis.format = (kpi: WorkerKPI): string => {
|
|
155
163
|
const progress = kpis.progress(kpi)
|
|
156
164
|
const progressPercent = Math.round(progress * 100)
|
|
157
165
|
const trendEmoji = kpi.trend === 'up' ? '↑' : kpi.trend === 'down' ? '↓' : '→'
|
|
@@ -175,17 +183,15 @@ kpis.format = (kpi: KPI): string => {
|
|
|
175
183
|
* ```
|
|
176
184
|
*/
|
|
177
185
|
kpis.compare = (
|
|
178
|
-
previous: Pick<
|
|
179
|
-
current: Pick<
|
|
186
|
+
previous: Pick<WorkerKPI, 'current' | 'target'>,
|
|
187
|
+
current: Pick<WorkerKPI, 'current' | 'target'>
|
|
180
188
|
): {
|
|
181
189
|
delta: number
|
|
182
190
|
percentChange: number
|
|
183
191
|
improved: boolean
|
|
184
192
|
} => {
|
|
185
193
|
const delta = current.current - previous.current
|
|
186
|
-
const percentChange = previous.current !== 0
|
|
187
|
-
? (delta / previous.current) * 100
|
|
188
|
-
: 0
|
|
194
|
+
const percentChange = previous.current !== 0 ? (delta / previous.current) * 100 : 0
|
|
189
195
|
|
|
190
196
|
// Improved if we got closer to the target
|
|
191
197
|
const previousGap = Math.abs(previous.target - previous.current)
|
|
@@ -202,6 +208,10 @@ kpis.compare = (
|
|
|
202
208
|
/**
|
|
203
209
|
* Define OKRs (Objectives and Key Results)
|
|
204
210
|
*
|
|
211
|
+
* Uses WorkerOKR which has WorkerRef for owner.
|
|
212
|
+
* For the full org.ai OKR with `id`, `status`, `period`, etc.,
|
|
213
|
+
* use the OKR type directly.
|
|
214
|
+
*
|
|
205
215
|
* @param definition - OKR definition
|
|
206
216
|
* @returns The defined OKR
|
|
207
217
|
*
|
|
@@ -229,12 +239,12 @@ kpis.compare = (
|
|
|
229
239
|
* unit: '%',
|
|
230
240
|
* },
|
|
231
241
|
* ],
|
|
232
|
-
* owner: 'engineering-team',
|
|
242
|
+
* owner: { id: 'engineering-team', type: 'agent' },
|
|
233
243
|
* dueDate: new Date('2024-03-31'),
|
|
234
244
|
* })
|
|
235
245
|
* ```
|
|
236
246
|
*/
|
|
237
|
-
export function okrs(definition:
|
|
247
|
+
export function okrs(definition: WorkerOKR): WorkerOKR {
|
|
238
248
|
return definition
|
|
239
249
|
}
|
|
240
250
|
|
|
@@ -250,7 +260,7 @@ export function okrs(definition: OKR): OKR {
|
|
|
250
260
|
* console.log(progress) // 0.67 (67% complete)
|
|
251
261
|
* ```
|
|
252
262
|
*/
|
|
253
|
-
okrs.progress = (okr:
|
|
263
|
+
okrs.progress = (okr: WorkerOKR): number => {
|
|
254
264
|
if (okr.keyResults.length === 0) return 0
|
|
255
265
|
|
|
256
266
|
const totalProgress = okr.keyResults.reduce((sum, kr) => {
|
|
@@ -277,17 +287,11 @@ okrs.progress = (okr: OKR): number => {
|
|
|
277
287
|
* )
|
|
278
288
|
* ```
|
|
279
289
|
*/
|
|
280
|
-
okrs.updateKeyResult = (
|
|
281
|
-
|
|
282
|
-
keyResultName: string,
|
|
283
|
-
current: number
|
|
284
|
-
): OKR => {
|
|
290
|
+
okrs.updateKeyResult = (okr: WorkerOKR, keyResultName: string, current: number): WorkerOKR => {
|
|
291
|
+
const { progress: _progress, ...rest } = okr
|
|
285
292
|
return {
|
|
286
|
-
...
|
|
287
|
-
keyResults: okr.keyResults.map((kr) =>
|
|
288
|
-
kr.name === keyResultName ? { ...kr, current } : kr
|
|
289
|
-
),
|
|
290
|
-
progress: undefined, // Will be recalculated
|
|
293
|
+
...rest,
|
|
294
|
+
keyResults: okr.keyResults.map((kr) => (kr.name === keyResultName ? { ...kr, current } : kr)),
|
|
291
295
|
}
|
|
292
296
|
}
|
|
293
297
|
|
|
@@ -303,7 +307,7 @@ okrs.updateKeyResult = (
|
|
|
303
307
|
* const onTrack = okrs.onTrack(engineeringOKR)
|
|
304
308
|
* ```
|
|
305
309
|
*/
|
|
306
|
-
okrs.onTrack = (okr:
|
|
310
|
+
okrs.onTrack = (okr: WorkerOKR, threshold = 0.7): boolean => {
|
|
307
311
|
return okrs.progress(okr) >= threshold
|
|
308
312
|
}
|
|
309
313
|
|
|
@@ -323,7 +327,7 @@ okrs.onTrack = (okr: OKR, threshold = 0.7): boolean => {
|
|
|
323
327
|
* // • Change Failure Rate: 15/5 % (300%)
|
|
324
328
|
* ```
|
|
325
329
|
*/
|
|
326
|
-
okrs.format = (okr:
|
|
330
|
+
okrs.format = (okr: WorkerOKR): string => {
|
|
327
331
|
const progress = okrs.progress(okr)
|
|
328
332
|
const progressPercent = Math.round(progress * 100)
|
|
329
333
|
|
|
@@ -332,12 +336,13 @@ okrs.format = (okr: OKR): string => {
|
|
|
332
336
|
...okr.keyResults.map((kr) => {
|
|
333
337
|
const krProgress = kpis.progress(kr)
|
|
334
338
|
const krPercent = Math.round(krProgress * 100)
|
|
335
|
-
return `
|
|
339
|
+
return ` - ${kr.name}: ${kr.current}/${kr.target} ${kr.unit} (${krPercent}%)`
|
|
336
340
|
}),
|
|
337
341
|
]
|
|
338
342
|
|
|
339
343
|
if (okr.owner) {
|
|
340
|
-
|
|
344
|
+
const ownerDisplay = typeof okr.owner === 'string' ? okr.owner : okr.owner.id
|
|
345
|
+
lines.push(` Owner: ${ownerDisplay}`)
|
|
341
346
|
}
|
|
342
347
|
|
|
343
348
|
if (okr.dueDate) {
|