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.
Files changed (197) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +136 -180
  3. package/dist/actions.d.ts.map +1 -1
  4. package/dist/actions.js +34 -21
  5. package/dist/actions.js.map +1 -1
  6. package/dist/agent-comms.d.ts +438 -0
  7. package/dist/agent-comms.d.ts.map +1 -0
  8. package/dist/agent-comms.js +677 -0
  9. package/dist/agent-comms.js.map +1 -0
  10. package/dist/approve.d.ts +40 -8
  11. package/dist/approve.d.ts.map +1 -1
  12. package/dist/approve.js +86 -20
  13. package/dist/approve.js.map +1 -1
  14. package/dist/ask.d.ts +38 -7
  15. package/dist/ask.d.ts.map +1 -1
  16. package/dist/ask.js +85 -25
  17. package/dist/ask.js.map +1 -1
  18. package/dist/browse.d.ts +223 -0
  19. package/dist/browse.d.ts.map +1 -0
  20. package/dist/browse.js +392 -0
  21. package/dist/browse.js.map +1 -0
  22. package/dist/capability-tiers.d.ts +230 -0
  23. package/dist/capability-tiers.d.ts.map +1 -0
  24. package/dist/capability-tiers.js +388 -0
  25. package/dist/capability-tiers.js.map +1 -0
  26. package/dist/cascade-context.d.ts +523 -0
  27. package/dist/cascade-context.d.ts.map +1 -0
  28. package/dist/cascade-context.js +494 -0
  29. package/dist/cascade-context.js.map +1 -0
  30. package/dist/client.d.ts +162 -0
  31. package/dist/client.d.ts.map +1 -0
  32. package/dist/client.js +64 -0
  33. package/dist/client.js.map +1 -0
  34. package/dist/decide.d.ts +42 -6
  35. package/dist/decide.d.ts.map +1 -1
  36. package/dist/decide.js +54 -11
  37. package/dist/decide.js.map +1 -1
  38. package/dist/do.d.ts +36 -7
  39. package/dist/do.d.ts.map +1 -1
  40. package/dist/do.js +82 -39
  41. package/dist/do.js.map +1 -1
  42. package/dist/error-escalation.d.ts +416 -0
  43. package/dist/error-escalation.d.ts.map +1 -0
  44. package/dist/error-escalation.js +656 -0
  45. package/dist/error-escalation.js.map +1 -0
  46. package/dist/generate.d.ts +48 -7
  47. package/dist/generate.d.ts.map +1 -1
  48. package/dist/generate.js +49 -8
  49. package/dist/generate.js.map +1 -1
  50. package/dist/goals.d.ts +10 -9
  51. package/dist/goals.d.ts.map +1 -1
  52. package/dist/goals.js +30 -24
  53. package/dist/goals.js.map +1 -1
  54. package/dist/image.d.ts +189 -0
  55. package/dist/image.d.ts.map +1 -0
  56. package/dist/image.js +528 -0
  57. package/dist/image.js.map +1 -0
  58. package/dist/index.d.ts +59 -2
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.js +92 -2
  61. package/dist/index.js.map +1 -1
  62. package/dist/is.d.ts +45 -10
  63. package/dist/is.d.ts.map +1 -1
  64. package/dist/is.js +56 -21
  65. package/dist/is.js.map +1 -1
  66. package/dist/kpis.d.ts +24 -15
  67. package/dist/kpis.d.ts.map +1 -1
  68. package/dist/kpis.js +16 -14
  69. package/dist/kpis.js.map +1 -1
  70. package/dist/load-balancing.d.ts +395 -0
  71. package/dist/load-balancing.d.ts.map +1 -0
  72. package/dist/load-balancing.js +991 -0
  73. package/dist/load-balancing.js.map +1 -0
  74. package/dist/logger.d.ts +76 -0
  75. package/dist/logger.d.ts.map +1 -0
  76. package/dist/logger.js +39 -0
  77. package/dist/logger.js.map +1 -0
  78. package/dist/notify.d.ts +38 -9
  79. package/dist/notify.d.ts.map +1 -1
  80. package/dist/notify.js +72 -17
  81. package/dist/notify.js.map +1 -1
  82. package/dist/role.d.ts +5 -4
  83. package/dist/role.d.ts.map +1 -1
  84. package/dist/role.js +13 -10
  85. package/dist/role.js.map +1 -1
  86. package/dist/runtime.d.ts +310 -0
  87. package/dist/runtime.d.ts.map +1 -0
  88. package/dist/runtime.js +510 -0
  89. package/dist/runtime.js.map +1 -0
  90. package/dist/team.d.ts +11 -6
  91. package/dist/team.d.ts.map +1 -1
  92. package/dist/team.js +22 -15
  93. package/dist/team.js.map +1 -1
  94. package/dist/transports/email.d.ts +318 -0
  95. package/dist/transports/email.d.ts.map +1 -0
  96. package/dist/transports/email.js +779 -0
  97. package/dist/transports/email.js.map +1 -0
  98. package/dist/transports/slack.d.ts +515 -0
  99. package/dist/transports/slack.d.ts.map +1 -0
  100. package/dist/transports/slack.js +844 -0
  101. package/dist/transports/slack.js.map +1 -0
  102. package/dist/transports.d.ts.map +1 -1
  103. package/dist/transports.js +44 -25
  104. package/dist/transports.js.map +1 -1
  105. package/dist/types.d.ts +149 -19
  106. package/dist/types.d.ts.map +1 -1
  107. package/dist/types.js +6 -0
  108. package/dist/types.js.map +1 -1
  109. package/dist/utils/id.d.ts +19 -0
  110. package/dist/utils/id.d.ts.map +1 -0
  111. package/dist/utils/id.js +21 -0
  112. package/dist/utils/id.js.map +1 -0
  113. package/dist/video.d.ts +203 -0
  114. package/dist/video.d.ts.map +1 -0
  115. package/dist/video.js +528 -0
  116. package/dist/video.js.map +1 -0
  117. package/dist/worker.d.ts +343 -0
  118. package/dist/worker.d.ts.map +1 -0
  119. package/dist/worker.js +698 -0
  120. package/dist/worker.js.map +1 -0
  121. package/package.json +24 -5
  122. package/src/actions.ts +48 -38
  123. package/src/agent-comms.ts +1200 -0
  124. package/src/approve.ts +91 -20
  125. package/src/ask.ts +99 -25
  126. package/src/browse.ts +627 -0
  127. package/src/capability-tiers.ts +545 -0
  128. package/src/cascade-context.ts +648 -0
  129. package/src/client.ts +221 -0
  130. package/src/decide.ts +81 -35
  131. package/src/do.ts +98 -52
  132. package/src/error-escalation.ts +1123 -0
  133. package/src/generate.ts +52 -18
  134. package/src/goals.ts +36 -27
  135. package/src/image.ts +816 -0
  136. package/src/index.ts +410 -2
  137. package/src/is.ts +59 -25
  138. package/src/kpis.ts +41 -36
  139. package/src/load-balancing.ts +1467 -0
  140. package/src/logger.ts +93 -0
  141. package/src/notify.ts +78 -17
  142. package/src/role.ts +30 -20
  143. package/src/runtime.ts +796 -0
  144. package/src/team.ts +24 -19
  145. package/src/transports/email.ts +1160 -0
  146. package/src/transports/slack.ts +1320 -0
  147. package/src/transports.ts +58 -43
  148. package/src/types.ts +182 -46
  149. package/src/utils/id.ts +21 -0
  150. package/src/video.ts +906 -0
  151. package/src/worker.ts +1007 -0
  152. package/test/agent-comms.test.ts +1397 -0
  153. package/test/approve.test.ts +305 -0
  154. package/test/ask.test.ts +274 -0
  155. package/test/browse.test.ts +361 -0
  156. package/test/capability-tiers.test.ts +631 -0
  157. package/test/cascade-context.test.ts +692 -0
  158. package/test/decide.test.ts +252 -0
  159. package/test/do.test.ts +144 -0
  160. package/test/error-escalation.test.ts +1205 -0
  161. package/test/error-logging.test.ts +357 -0
  162. package/test/generate.test.ts +319 -0
  163. package/test/image.test.ts +398 -0
  164. package/test/is.test.ts +287 -0
  165. package/test/load-balancing-safety.test.ts +404 -0
  166. package/test/load-balancing-thread-safety.test.ts +464 -0
  167. package/test/load-balancing.test.ts +1145 -0
  168. package/test/notify.test.ts +434 -0
  169. package/test/primitives.test.ts +320 -0
  170. package/test/runtime-integration.test.ts +892 -0
  171. package/test/transports/crypto.test.ts +230 -0
  172. package/test/transports/email.test.ts +866 -0
  173. package/test/transports/id-generation.test.ts +91 -0
  174. package/test/transports/slack.test.ts +760 -0
  175. package/test/type-safety.test.ts +834 -0
  176. package/test/types.test.ts +95 -2
  177. package/test/video.test.ts +530 -0
  178. package/test/worker.test.ts +1433 -0
  179. package/tsconfig.json +4 -1
  180. package/vitest.config.ts +42 -0
  181. package/wrangler.jsonc +36 -0
  182. package/.turbo/turbo-build.log +0 -5
  183. package/src/actions.js +0 -436
  184. package/src/approve.js +0 -234
  185. package/src/ask.js +0 -226
  186. package/src/decide.js +0 -244
  187. package/src/do.js +0 -227
  188. package/src/generate.js +0 -298
  189. package/src/goals.js +0 -205
  190. package/src/index.js +0 -68
  191. package/src/is.js +0 -317
  192. package/src/kpis.js +0 -270
  193. package/src/notify.js +0 -219
  194. package/src/role.js +0 -110
  195. package/src/team.js +0 -130
  196. package/src/transports.js +0 -357
  197. 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 './types.js'
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: KPI): KPI
50
- export function kpis(definition: KPI[]): KPI[]
51
- export function kpis(definition: KPI | KPI[]): KPI | KPI[] {
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: KPI, current: number): KPI => {
78
+ kpis.update = (kpi: WorkerKPI, current: number): WorkerKPI => {
70
79
  // Determine trend
71
- let trend: KPI['trend'] = 'stable'
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<KPI, 'current' | 'target'>): number => {
98
- if (kpi.target === 0) return 0
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<KPI, 'current' | 'target'>, threshold = 0.8): boolean => {
116
- return kpis.progress(kpi) >= threshold
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<KPI, 'current' | 'target'>): number => {
132
- return kpi.target - kpi.current
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: KPI): string => {
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<KPI, 'current' | 'target'>,
179
- current: Pick<KPI, 'current' | 'target'>
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: OKR): OKR {
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: OKR): number => {
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
- okr: OKR,
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
- ...okr,
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: OKR, threshold = 0.7): boolean => {
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: OKR): string => {
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 ` ${kr.name}: ${kr.current}/${kr.target} ${kr.unit} (${krPercent}%)`
339
+ return ` - ${kr.name}: ${kr.current}/${kr.target} ${kr.unit} (${krPercent}%)`
336
340
  }),
337
341
  ]
338
342
 
339
343
  if (okr.owner) {
340
- lines.push(` Owner: ${okr.owner}`)
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) {