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/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
|
package/dist/is.d.ts.map
ADDED
|
@@ -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"}
|