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.
Files changed (83) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +9 -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
package/dist/index.js ADDED
@@ -0,0 +1,69 @@
1
+ /**
2
+ * digital-workers - Abstract interface for organizing digital work
3
+ *
4
+ * This package provides the foundational abstraction for structuring work
5
+ * independent of whether AI agents or humans perform individual tasks. It
6
+ * defines a unified Worker interface that enables workflows to be designed
7
+ * once and executed by any combination of AI and human workers.
8
+ *
9
+ * Package relationships:
10
+ * - `autonomous-agents` - Implements Worker for AI agents
11
+ * - `human-in-the-loop` - Implements Worker for humans
12
+ * - `ai-workflows` - Uses digital-workers to orchestrate execution
13
+ *
14
+ * The key insight: define WHAT work needs to happen, not WHO does it.
15
+ *
16
+ * ## Worker Actions
17
+ *
18
+ * Worker actions (notify, ask, approve, decide, do) are durable workflow actions
19
+ * that integrate with ai-workflows. They can be invoked via:
20
+ *
21
+ * 1. `$.do('Worker.notify', data)` - Durable action
22
+ * 2. `$.send('Worker.notify', data)` - Fire and forget
23
+ * 3. `$.notify(target, message)` - Convenience method (when using withWorkers)
24
+ *
25
+ * @example
26
+ * ```ts
27
+ * import { Workflow } from 'ai-workflows'
28
+ * import { registerWorkerActions, withWorkers } from 'digital-workers'
29
+ *
30
+ * const workflow = Workflow($ => {
31
+ * registerWorkerActions($)
32
+ * const worker$ = withWorkers($)
33
+ *
34
+ * $.on.Expense.submitted(async (expense) => {
35
+ * await worker$.notify(finance, `New expense: ${expense.amount}`)
36
+ *
37
+ * const approval = await worker$.approve(
38
+ * `Expense: $${expense.amount}`,
39
+ * manager,
40
+ * { via: 'slack' }
41
+ * )
42
+ *
43
+ * if (approval.approved) {
44
+ * await worker$.notify(expense.submitter, 'Expense approved!')
45
+ * }
46
+ * })
47
+ * })
48
+ * ```
49
+ *
50
+ * @packageDocumentation
51
+ */
52
+ // Export workflow integration
53
+ export { registerWorkerActions, withWorkers, handleNotify, handleAsk, handleApprove, handleDecide, handleDo, notify as notifyAction, ask as askAction, approve as approveAction, decide as decideAction, } from './actions.js';
54
+ // Export core functions
55
+ export { Role } from './role.js';
56
+ export { Team } from './team.js';
57
+ export { Goals } from './goals.js';
58
+ export { approve } from './approve.js';
59
+ export { ask } from './ask.js';
60
+ export { do } from './do.js';
61
+ export { decide } from './decide.js';
62
+ export { generate } from './generate.js';
63
+ export { is } from './is.js';
64
+ export { notify } from './notify.js';
65
+ export { kpis, okrs } from './kpis.js';
66
+ // Export verb definitions
67
+ export { WorkerVerbs } from './types.js';
68
+ export { channelToTransport, getWorkerTransports, getTeamTransports, resolveAddress, resolveWorkerAddresses, getPrimaryAddress, registerTransport, getTransportHandler, hasTransport, listTransports, sendViaTransport, sendToMultipleTransports, buildNotifyPayload, buildAskPayload, buildApprovePayload, toDigitalToolsMessage, fromDigitalToolsMessage, MessageTypeMapping, CallTypeMapping, } from './transports.js';
69
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AAKH,8BAA8B;AAC9B,OAAO,EACL,qBAAqB,EACrB,WAAW,EACX,YAAY,EACZ,SAAS,EACT,aAAa,EACb,YAAY,EACZ,QAAQ,EACR,MAAM,IAAI,YAAY,EACtB,GAAG,IAAI,SAAS,EAChB,OAAO,IAAI,aAAa,EACxB,MAAM,IAAI,YAAY,GACvB,MAAM,cAAc,CAAA;AAErB,wBAAwB;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAA;AAC9B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACpC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEtC,0BAA0B;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAaxC,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,iBAAiB,EACjB,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,uBAAuB,EACvB,kBAAkB,EAClB,eAAe,GAChB,MAAM,iBAAiB,CAAA"}
package/dist/is.d.ts ADDED
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Type validation and checking functionality for digital workers
3
+ */
4
+ import { type SimpleSchema } from 'ai-functions';
5
+ import type { TypeCheckResult, IsOptions } from './types.js';
6
+ /**
7
+ * Check if a value matches an expected type or schema
8
+ *
9
+ * Uses AI-powered validation for complex types and schemas.
10
+ * Can also perform type coercion when enabled.
11
+ *
12
+ * @param value - The value to check
13
+ * @param type - Type name or schema to validate against
14
+ * @param options - Validation options
15
+ * @returns Promise resolving to validation result
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // Simple type checking
20
+ * const result = await is('hello@example.com', 'email')
21
+ * console.log(result.valid) // true
22
+ * ```
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * // Schema validation
27
+ * const result = await is(
28
+ * { name: 'John', age: 30 },
29
+ * {
30
+ * name: 'Full name',
31
+ * age: 'Age in years (number)',
32
+ * email: 'Email address',
33
+ * }
34
+ * )
35
+ * console.log(result.valid) // false - missing email
36
+ * console.log(result.errors) // ['Missing required field: email']
37
+ * ```
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * // With coercion
42
+ * const result = await is('123', 'number', { coerce: true })
43
+ * console.log(result.valid) // true
44
+ * console.log(result.value) // 123 (as number)
45
+ * ```
46
+ */
47
+ export declare function is(value: unknown, type: string | SimpleSchema, options?: IsOptions): Promise<TypeCheckResult>;
48
+ export declare namespace is {
49
+ var email: (value: unknown) => Promise<TypeCheckResult>;
50
+ var url: (value: unknown) => Promise<TypeCheckResult>;
51
+ var date: (value: unknown, options?: IsOptions) => Promise<TypeCheckResult>;
52
+ var custom: (value: unknown, validator: (v: unknown) => boolean | Promise<boolean>) => Promise<TypeCheckResult>;
53
+ }
54
+ //# sourceMappingURL=is.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is.d.ts","sourceRoot":"","sources":["../src/is.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAA2B,KAAK,YAAY,EAAE,MAAM,cAAc,CAAA;AACzE,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAsB,EAAE,CACtB,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,MAAM,GAAG,YAAY,EAC3B,OAAO,GAAE,SAAc,GACtB,OAAO,CAAC,eAAe,CAAC,CAU1B;yBAdqB,EAAE;uBAqNC,OAAO,KAAG,OAAO,CAAC,eAAe,CAAC;qBAiBpC,OAAO,KAAG,OAAO,CAAC,eAAe,CAAC;sBA6BjC,OAAO,YAAW,SAAS,KAAQ,OAAO,CAAC,eAAe,CAAC;wBA+C1E,OAAO,aACH,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,KACpD,OAAO,CAAC,eAAe,CAAC"}
package/dist/is.js ADDED
@@ -0,0 +1,318 @@
1
+ /**
2
+ * Type validation and checking functionality for digital workers
3
+ */
4
+ import { generateObject } from 'ai-functions';
5
+ import { schema as convertSchema } from 'ai-functions';
6
+ /**
7
+ * Check if a value matches an expected type or schema
8
+ *
9
+ * Uses AI-powered validation for complex types and schemas.
10
+ * Can also perform type coercion when enabled.
11
+ *
12
+ * @param value - The value to check
13
+ * @param type - Type name or schema to validate against
14
+ * @param options - Validation options
15
+ * @returns Promise resolving to validation result
16
+ *
17
+ * @example
18
+ * ```ts
19
+ * // Simple type checking
20
+ * const result = await is('hello@example.com', 'email')
21
+ * console.log(result.valid) // true
22
+ * ```
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * // Schema validation
27
+ * const result = await is(
28
+ * { name: 'John', age: 30 },
29
+ * {
30
+ * name: 'Full name',
31
+ * age: 'Age in years (number)',
32
+ * email: 'Email address',
33
+ * }
34
+ * )
35
+ * console.log(result.valid) // false - missing email
36
+ * console.log(result.errors) // ['Missing required field: email']
37
+ * ```
38
+ *
39
+ * @example
40
+ * ```ts
41
+ * // With coercion
42
+ * const result = await is('123', 'number', { coerce: true })
43
+ * console.log(result.valid) // true
44
+ * console.log(result.value) // 123 (as number)
45
+ * ```
46
+ */
47
+ export async function is(value, type, options = {}) {
48
+ const { coerce = false, strict = false } = options;
49
+ // Handle simple type strings
50
+ if (typeof type === 'string') {
51
+ return validateSimpleType(value, type, { coerce, strict });
52
+ }
53
+ // Handle schema validation
54
+ return validateSchema(value, type, { coerce, strict });
55
+ }
56
+ /**
57
+ * Validate against a simple type name
58
+ */
59
+ async function validateSimpleType(value, type, options) {
60
+ const { coerce, strict } = options;
61
+ // Built-in JavaScript types
62
+ const builtInTypes = {
63
+ string: (v) => typeof v === 'string',
64
+ number: (v) => typeof v === 'number' && !isNaN(v),
65
+ boolean: (v) => typeof v === 'boolean',
66
+ object: (v) => typeof v === 'object' && v !== null && !Array.isArray(v),
67
+ array: (v) => Array.isArray(v),
68
+ null: (v) => v === null,
69
+ undefined: (v) => v === undefined,
70
+ function: (v) => typeof v === 'function',
71
+ };
72
+ // Check built-in types first
73
+ if (type in builtInTypes) {
74
+ const isValid = builtInTypes[type](value);
75
+ if (!isValid && coerce) {
76
+ // Try to coerce the value
77
+ const coerced = coerceValue(value, type);
78
+ if (coerced.success) {
79
+ return {
80
+ valid: true,
81
+ value: coerced.value,
82
+ };
83
+ }
84
+ }
85
+ return {
86
+ valid: isValid,
87
+ value: isValid ? value : undefined,
88
+ errors: isValid ? undefined : [`Value is not a valid ${type}`],
89
+ };
90
+ }
91
+ // Use AI for complex type validation
92
+ const result = await generateObject({
93
+ model: 'sonnet',
94
+ schema: {
95
+ valid: 'Whether the value matches the expected type (boolean)',
96
+ errors: ['List of validation errors if invalid'],
97
+ coercedValue: coerce ? 'The value coerced to the expected type' : undefined,
98
+ },
99
+ system: `You are a type validation expert. Determine if a value matches an expected type.
100
+
101
+ ${coerce ? 'If the value can be coerced to the expected type, provide the coerced value.' : ''}
102
+ ${strict ? 'Be strict in your validation - require exact type matches.' : 'Be flexible - allow reasonable type conversions.'}`,
103
+ prompt: `Validate if this value matches the expected type:
104
+
105
+ Value: ${JSON.stringify(value)}
106
+ Type: ${type}
107
+
108
+ Determine if the value is valid for this type.`,
109
+ });
110
+ const validation = result.object;
111
+ return {
112
+ valid: validation.valid,
113
+ value: coerce && validation.coercedValue !== undefined ? validation.coercedValue : value,
114
+ errors: validation.valid ? undefined : validation.errors,
115
+ };
116
+ }
117
+ /**
118
+ * Validate against a schema
119
+ */
120
+ async function validateSchema(value, schema, options) {
121
+ const { coerce, strict } = options;
122
+ try {
123
+ // Convert SimpleSchema to Zod schema
124
+ const zodSchema = convertSchema(schema);
125
+ // Parse the value
126
+ const parsed = zodSchema.parse(value);
127
+ return {
128
+ valid: true,
129
+ value: parsed,
130
+ };
131
+ }
132
+ catch (error) {
133
+ if (strict) {
134
+ return {
135
+ valid: false,
136
+ errors: [error.message],
137
+ };
138
+ }
139
+ // Use AI for more flexible validation
140
+ const result = await generateObject({
141
+ model: 'sonnet',
142
+ schema: {
143
+ valid: 'Whether the value matches the schema (boolean)',
144
+ errors: ['List of validation errors'],
145
+ coercedValue: coerce ? 'The value with corrections/coercions applied' : undefined,
146
+ },
147
+ system: `You are a schema validation expert. Validate a value against a schema.
148
+
149
+ ${coerce ? 'Try to coerce the value to match the schema where reasonable.' : ''}
150
+ Be helpful - provide clear error messages.`,
151
+ prompt: `Validate this value against the schema:
152
+
153
+ Value:
154
+ ${JSON.stringify(value, null, 2)}
155
+
156
+ Schema:
157
+ ${JSON.stringify(schema, null, 2)}
158
+
159
+ Check if the value matches the schema structure and types.`,
160
+ });
161
+ const validation = result.object;
162
+ return {
163
+ valid: validation.valid,
164
+ value: coerce && validation.coercedValue !== undefined ? validation.coercedValue : value,
165
+ errors: validation.valid ? undefined : validation.errors,
166
+ };
167
+ }
168
+ }
169
+ /**
170
+ * Try to coerce a value to a specific type
171
+ */
172
+ function coerceValue(value, type) {
173
+ try {
174
+ switch (type) {
175
+ case 'string':
176
+ return { success: true, value: String(value) };
177
+ case 'number':
178
+ const num = Number(value);
179
+ return { success: !isNaN(num), value: num };
180
+ case 'boolean':
181
+ if (typeof value === 'string') {
182
+ const lower = value.toLowerCase();
183
+ if (lower === 'true' || lower === '1') {
184
+ return { success: true, value: true };
185
+ }
186
+ if (lower === 'false' || lower === '0') {
187
+ return { success: true, value: false };
188
+ }
189
+ }
190
+ return { success: true, value: Boolean(value) };
191
+ case 'array':
192
+ if (Array.isArray(value)) {
193
+ return { success: true, value };
194
+ }
195
+ return { success: true, value: [value] };
196
+ default:
197
+ return { success: false };
198
+ }
199
+ }
200
+ catch {
201
+ return { success: false };
202
+ }
203
+ }
204
+ /**
205
+ * Check if a value is valid email
206
+ *
207
+ * @param value - Value to check
208
+ * @returns Promise resolving to validation result
209
+ *
210
+ * @example
211
+ * ```ts
212
+ * const result = await is.email('test@example.com')
213
+ * console.log(result.valid) // true
214
+ * ```
215
+ */
216
+ is.email = async (value) => {
217
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
218
+ const valid = typeof value === 'string' && emailRegex.test(value);
219
+ return {
220
+ valid,
221
+ value: valid ? value : undefined,
222
+ errors: valid ? undefined : ['Invalid email format'],
223
+ };
224
+ };
225
+ /**
226
+ * Check if a value is a valid URL
227
+ *
228
+ * @param value - Value to check
229
+ * @returns Promise resolving to validation result
230
+ */
231
+ is.url = async (value) => {
232
+ try {
233
+ if (typeof value !== 'string') {
234
+ return {
235
+ valid: false,
236
+ errors: ['Value must be a string'],
237
+ };
238
+ }
239
+ new URL(value);
240
+ return {
241
+ valid: true,
242
+ value,
243
+ };
244
+ }
245
+ catch {
246
+ return {
247
+ valid: false,
248
+ errors: ['Invalid URL format'],
249
+ };
250
+ }
251
+ };
252
+ /**
253
+ * Check if a value is a valid date
254
+ *
255
+ * @param value - Value to check
256
+ * @param options - Validation options
257
+ * @returns Promise resolving to validation result
258
+ */
259
+ is.date = async (value, options = {}) => {
260
+ const { coerce } = options;
261
+ if (value instanceof Date) {
262
+ return {
263
+ valid: !isNaN(value.getTime()),
264
+ value,
265
+ errors: isNaN(value.getTime()) ? ['Invalid date'] : undefined,
266
+ };
267
+ }
268
+ if (coerce) {
269
+ try {
270
+ const date = new Date(value);
271
+ if (!isNaN(date.getTime())) {
272
+ return {
273
+ valid: true,
274
+ value: date,
275
+ };
276
+ }
277
+ }
278
+ catch {
279
+ // Fall through to invalid
280
+ }
281
+ }
282
+ return {
283
+ valid: false,
284
+ errors: ['Invalid date'],
285
+ };
286
+ };
287
+ /**
288
+ * Check if a value matches a custom validation function
289
+ *
290
+ * @param value - Value to check
291
+ * @param validator - Validation function
292
+ * @returns Promise resolving to validation result
293
+ *
294
+ * @example
295
+ * ```ts
296
+ * const result = await is.custom(
297
+ * 42,
298
+ * (v) => typeof v === 'number' && v > 0 && v < 100
299
+ * )
300
+ * ```
301
+ */
302
+ is.custom = async (value, validator) => {
303
+ try {
304
+ const valid = await validator(value);
305
+ return {
306
+ valid,
307
+ value: valid ? value : undefined,
308
+ errors: valid ? undefined : ['Custom validation failed'],
309
+ };
310
+ }
311
+ catch (error) {
312
+ return {
313
+ valid: false,
314
+ errors: [error.message],
315
+ };
316
+ }
317
+ };
318
+ //# sourceMappingURL=is.js.map
package/dist/is.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is.js","sourceRoot":"","sources":["../src/is.ts"],"names":[],"mappings":"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"}
package/dist/kpis.d.ts ADDED
@@ -0,0 +1,103 @@
1
+ /**
2
+ * KPI and OKR tracking functionality for digital workers
3
+ */
4
+ import type { KPI, OKR } from './types.js';
5
+ /**
6
+ * Define and track Key Performance Indicators
7
+ *
8
+ * @param definition - KPI definition or array of KPIs
9
+ * @returns The defined KPI(s)
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * const deploymentFrequency = kpis({
14
+ * name: 'Deployment Frequency',
15
+ * description: 'Number of deployments per week',
16
+ * current: 5,
17
+ * target: 10,
18
+ * unit: 'deploys/week',
19
+ * trend: 'up',
20
+ * period: 'weekly',
21
+ * })
22
+ * ```
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * // Define multiple KPIs
27
+ * const teamKPIs = kpis([
28
+ * {
29
+ * name: 'Code Quality',
30
+ * description: 'SonarQube quality score',
31
+ * current: 85,
32
+ * target: 90,
33
+ * unit: 'score',
34
+ * trend: 'up',
35
+ * },
36
+ * {
37
+ * name: 'Test Coverage',
38
+ * description: 'Percentage of code covered by tests',
39
+ * current: 75,
40
+ * target: 80,
41
+ * unit: '%',
42
+ * trend: 'up',
43
+ * },
44
+ * ])
45
+ * ```
46
+ */
47
+ export declare function kpis(definition: KPI): KPI;
48
+ export declare function kpis(definition: KPI[]): KPI[];
49
+ export declare namespace kpis {
50
+ var update: (kpi: KPI, current: number) => KPI;
51
+ var progress: (kpi: Pick<KPI, "current" | "target">) => number;
52
+ var onTrack: (kpi: Pick<KPI, "current" | "target">, threshold?: number) => boolean;
53
+ var gap: (kpi: Pick<KPI, "current" | "target">) => number;
54
+ var format: (kpi: KPI) => string;
55
+ var compare: (previous: Pick<KPI, "current" | "target">, current: Pick<KPI, "current" | "target">) => {
56
+ delta: number;
57
+ percentChange: number;
58
+ improved: boolean;
59
+ };
60
+ }
61
+ /**
62
+ * Define OKRs (Objectives and Key Results)
63
+ *
64
+ * @param definition - OKR definition
65
+ * @returns The defined OKR
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * const engineeringOKR = okrs({
70
+ * objective: 'Improve development velocity',
71
+ * keyResults: [
72
+ * {
73
+ * name: 'Deployment Frequency',
74
+ * current: 5,
75
+ * target: 10,
76
+ * unit: 'deploys/week',
77
+ * },
78
+ * {
79
+ * name: 'Lead Time',
80
+ * current: 48,
81
+ * target: 24,
82
+ * unit: 'hours',
83
+ * },
84
+ * {
85
+ * name: 'Change Failure Rate',
86
+ * current: 15,
87
+ * target: 5,
88
+ * unit: '%',
89
+ * },
90
+ * ],
91
+ * owner: 'engineering-team',
92
+ * dueDate: new Date('2024-03-31'),
93
+ * })
94
+ * ```
95
+ */
96
+ export declare function okrs(definition: OKR): OKR;
97
+ export declare namespace okrs {
98
+ var progress: (okr: OKR) => number;
99
+ var updateKeyResult: (okr: OKR, keyResultName: string, current: number) => OKR;
100
+ var onTrack: (okr: OKR, threshold?: number) => boolean;
101
+ var format: (okr: OKR) => string;
102
+ }
103
+ //# sourceMappingURL=kpis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kpis.d.ts","sourceRoot":"","sources":["../src/kpis.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,YAAY,CAAA;AAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,wBAAgB,IAAI,CAAC,UAAU,EAAE,GAAG,GAAG,GAAG,CAAA;AAC1C,wBAAgB,IAAI,CAAC,UAAU,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAAA;yBAA9B,IAAI;sBAmBA,GAAG,WAAW,MAAM,KAAG,GAAG;wBA4BxB,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,CAAC,KAAG,MAAM;uBAkBzC,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,CAAC,yBAAoB,OAAO;mBAgB9D,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,CAAC,KAAG,MAAM;sBAuBrC,GAAG,KAAG,MAAM;4BAwBpB,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,CAAC,WAChC,IAAI,CAAC,GAAG,EAAE,SAAS,GAAG,QAAQ,CAAC,KACvC;QACD,KAAK,EAAE,MAAM,CAAA;QACb,aAAa,EAAE,MAAM,CAAA;QACrB,QAAQ,EAAE,OAAO,CAAA;KAClB;;AAkBD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,IAAI,CAAC,UAAU,EAAE,GAAG,GAAG,GAAG,CAEzC;yBAFe,IAAI;wBAgBE,GAAG,KAAG,MAAM;+BA4B3B,GAAG,iBACO,MAAM,WACZ,MAAM,KACd,GAAG;uBAsBe,GAAG,yBAAoB,OAAO;sBAoB/B,GAAG,KAAG,MAAM"}