@recombine-ai/engine 0.3.1 → 0.4.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/build/index.d.ts +1 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -1
- package/build/lib/ai.d.ts +14 -1
- package/build/lib/ai.d.ts.map +1 -1
- package/build/lib/ai.js +24 -10
- package/build/lib/schedule.d.ts +23 -0
- package/build/lib/schedule.d.ts.map +1 -1
- package/build/lib/schedule.js +52 -25
- package/changelog.md +13 -0
- package/package.json +1 -1
- package/readme.md +1 -1
package/build/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { AIEngine } from './lib/ai';
|
|
2
2
|
export { AIEngine } from './lib/ai';
|
|
3
3
|
export declare const createAIEngine: typeof AIEngine.createAIEngine;
|
|
4
|
-
export { delayFactory, Schedule } from './lib/schedule';
|
|
4
|
+
export { delayFactory, Schedule, createScheduleQuery } from './lib/schedule';
|
|
5
5
|
export { Scheduler, Logger } from './lib/interfaces';
|
|
6
6
|
export * from './lib/bosun';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/build/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,eAAO,MAAM,cAAc,gCAA0B,CAAA;AAErD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC,eAAO,MAAM,cAAc,gCAA0B,CAAA;AAErD,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAE5E,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAEpD,cAAc,aAAa,CAAA"}
|
package/build/index.js
CHANGED
|
@@ -14,11 +14,12 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
exports.delayFactory = exports.createAIEngine = exports.AIEngine = void 0;
|
|
17
|
+
exports.createScheduleQuery = exports.delayFactory = exports.createAIEngine = exports.AIEngine = void 0;
|
|
18
18
|
const ai_1 = require("./lib/ai");
|
|
19
19
|
var ai_2 = require("./lib/ai");
|
|
20
20
|
Object.defineProperty(exports, "AIEngine", { enumerable: true, get: function () { return ai_2.AIEngine; } });
|
|
21
21
|
exports.createAIEngine = ai_1.AIEngine.createAIEngine;
|
|
22
22
|
var schedule_1 = require("./lib/schedule");
|
|
23
23
|
Object.defineProperty(exports, "delayFactory", { enumerable: true, get: function () { return schedule_1.delayFactory; } });
|
|
24
|
+
Object.defineProperty(exports, "createScheduleQuery", { enumerable: true, get: function () { return schedule_1.createScheduleQuery; } });
|
|
24
25
|
__exportStar(require("./lib/bosun"), exports);
|
package/build/lib/ai.d.ts
CHANGED
|
@@ -75,6 +75,14 @@ export declare namespace AIEngine {
|
|
|
75
75
|
/** Error handler called if an error occurred during LLM API call or in `execute` function */
|
|
76
76
|
onError: (error: string) => Promise<unknown>;
|
|
77
77
|
}
|
|
78
|
+
/**
|
|
79
|
+
* A useful trace of a step execution. It's properties are filled during the execution. There is no guarantee that any of them will be filled.
|
|
80
|
+
*/
|
|
81
|
+
type StepTrace = {
|
|
82
|
+
renderedPrompt?: string;
|
|
83
|
+
receivedContext?: Record<string, unknown>;
|
|
84
|
+
receivedPrompt?: string;
|
|
85
|
+
};
|
|
78
86
|
/**
|
|
79
87
|
* An AI workflow composed of steps.
|
|
80
88
|
*/
|
|
@@ -89,7 +97,12 @@ export declare namespace AIEngine {
|
|
|
89
97
|
* @param messages - The conversation context for the workflow
|
|
90
98
|
* @returns The proposed reply if workflow completes, or null if terminated
|
|
91
99
|
*/
|
|
92
|
-
run: (messages: Conversation) => Promise<
|
|
100
|
+
run: (messages: Conversation) => Promise<{
|
|
101
|
+
reply: string | null;
|
|
102
|
+
trace: {
|
|
103
|
+
steps: Record<string, StepTrace>;
|
|
104
|
+
};
|
|
105
|
+
}>;
|
|
93
106
|
/**
|
|
94
107
|
* Rewinds the workflow execution to a specific step.
|
|
95
108
|
* @param step - The step to rewind to
|
package/build/lib/ai.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAc,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAGvD,yBAAiB,QAAQ,CAAC;IACtB;;OAEG;IACH,KAAY,UAAU,GAChB,oBAAoB,GACpB,uBAAuB,GACvB,mBAAmB,GACnB,eAAe,GACf,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IAEnB,UAAiB,gBAAgB;QAC7B,8BAA8B;QAC9B,IAAI,EAAE,MAAM,CAAA;QAEZ,kDAAkD;QAClD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAE9D,0BAA0B;QAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;QAE/B,6EAA6E;QAC7E,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAC/C;IAED,UAAiB,OAAO;QACpB,8BAA8B;QAC9B,IAAI,EAAE,MAAM,CAAA;QAEZ,kDAAkD;QAClD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAE9D,qCAAqC;QACrC,KAAK,CAAC,EAAE,UAAU,CAAA;QAElB;;;WAGG;QACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QAErB;;;WAGG;QACH,MAAM,CAAC,EAAE,SAAS,CAAA;QAElB,8EAA8E;QAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAE1B;;;;;;;WAOG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEjC;;;;;;;;;;;;;;WAcG;QACH,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;QAE5C;;;;YAII;QACJ,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAE7D;;;;WAIG;QACH,WAAW,CAAC,EAAE,MAAM,CAAA;QAEpB,6FAA6F;QAC7F,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAC/C;IAED;;OAEG;IACH,UAAiB,QAAQ;QACrB;;WAEG;QACH,SAAS,EAAE,MAAM,IAAI,CAAA;QAErB;;;;;WAKG;QACH,GAAG,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"ai.d.ts","sourceRoot":"","sources":["../../src/lib/ai.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,KAAK,CAAA;AAE/B,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAc,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAGvD,yBAAiB,QAAQ,CAAC;IACtB;;OAEG;IACH,KAAY,UAAU,GAChB,oBAAoB,GACpB,uBAAuB,GACvB,mBAAmB,GACnB,eAAe,GACf,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA;IAEnB,UAAiB,gBAAgB;QAC7B,8BAA8B;QAC9B,IAAI,EAAE,MAAM,CAAA;QAEZ,kDAAkD;QAClD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAE9D,0BAA0B;QAC1B,OAAO,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;QAE/B,6EAA6E;QAC7E,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAC/C;IAED,UAAiB,OAAO;QACpB,8BAA8B;QAC9B,IAAI,EAAE,MAAM,CAAA;QAEZ,kDAAkD;QAClD,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAE9D,qCAAqC;QACrC,KAAK,CAAC,EAAE,UAAU,CAAA;QAElB;;;WAGG;QACH,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;QAErB;;;WAGG;QACH,MAAM,CAAC,EAAE,SAAS,CAAA;QAElB,8EAA8E;QAC9E,gBAAgB,CAAC,EAAE,OAAO,CAAA;QAE1B;;;;;;;WAOG;QACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAEjC;;;;;;;;;;;;;;WAcG;QACH,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;QAE5C;;;;YAII;QACJ,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;QAE7D;;;;WAIG;QACH,WAAW,CAAC,EAAE,MAAM,CAAA;QAEpB,6FAA6F;QAC7F,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAA;KAC/C;IAED;;OAEG;IACH,KAAY,SAAS,GAAG;QACpB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAA;IAED;;OAEG;IACH,UAAiB,QAAQ;QACrB;;WAEG;QACH,SAAS,EAAE,MAAM,IAAI,CAAA;QAErB;;;;;WAKG;QACH,GAAG,EAAE,CAAC,QAAQ,EAAE,YAAY,KAAK,OAAO,CAAC;YAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;YAAC,KAAK,EAAE;gBAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;aAAE,CAAA;SAAE,CAAC,CAAA;QAEhH;;;WAGG;QACH,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB,KAAK,IAAI,CAAA;QAEpD;;;WAGG;QACH,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;KACzD;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkDG;IACH,UAAiB,QAAQ;QACrB;;;;WAIG;QACH,cAAc,EAAE,CAAC,GAAG,KAAK,EAAE,KAAK,CAAC,OAAO,GAAG,gBAAgB,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;QAEnF;;;;WAIG;QACH,UAAU,EAAE,CAAC,CAAC,SAAS,OAAO,GAAG,gBAAgB,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;QAEjE;;;;WAIG;QACH,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;QAEjC;;;;WAIG;QACH,kBAAkB,EAAE,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,YAAY,CAAC;KAC9D;IAED;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACH,UAAiB,YAAY;QACzB;;;WAGG;QACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QAE/B;;;WAGG;QACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;QAEhC;;;;WAIG;QACH,QAAQ,EAAE,CAAC,gBAAgB,CAAC,EAAE,OAAO,KAAK,MAAM,CAAA;QAEhD;;;;;;;;;;;;WAYG;QACH,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QAEvC;;;;WAIG;QACH,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QAE9D;;;WAGG;QACH,qBAAqB,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,KAAK,IAAI,CAAA;QAExE;;;WAGG;QACH,2BAA2B,EAAE,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,KAAK,IAAI,CAAA;QAE7E;;;WAGG;QACH,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;QAE3C;;;WAGG;QACH,gBAAgB,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;QAErC;;;WAGG;QACH,UAAU,EAAE,MAAM,OAAO,EAAE,CAAA;KAC9B;IAED;;;OAGG;IACH,UAAiB,OAAO;QACpB,iGAAiG;QACjG,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAA;QACnC,sCAAsC;QACtC,IAAI,EAAE,MAAM,CAAA;QACZ,2DAA2D;QAC3D,QAAQ,CAAC,EAAE,MAAM,CAAA;KACpB;IAED,UAAiB,IAAI;QACjB,OAAO,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;KACjC;IAED;;OAEG;IACH,UAAiB,YAAY;QACzB;;;;WAIG;QACH,YAAY,CAAC,EAAE;YAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAA;SAAE,CAAA;QACzD;;WAEG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,CAAA;QACf;;WAEG;QACH,UAAU,CAAC,EAAE,UAAU,CAAA;KAC1B;IAED;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACH,SAAgB,cAAc,CAAC,GAAG,GAAE,YAAiB,GAAG,QAAQ,CAmQ/D;CA6BJ"}
|
package/build/lib/ai.js
CHANGED
|
@@ -102,6 +102,12 @@ var AIEngine;
|
|
|
102
102
|
let currentStep = 0;
|
|
103
103
|
let beforeEachCallback = async () => Promise.resolve(null);
|
|
104
104
|
const attempts = new Map();
|
|
105
|
+
const trace = {
|
|
106
|
+
steps: steps.reduce((acc, step) => {
|
|
107
|
+
acc[step.name] = {};
|
|
108
|
+
return acc;
|
|
109
|
+
}, {})
|
|
110
|
+
};
|
|
105
111
|
return {
|
|
106
112
|
terminate: () => {
|
|
107
113
|
logger.debug('AI Engine: Terminating conversation...');
|
|
@@ -119,7 +125,8 @@ var AIEngine;
|
|
|
119
125
|
await action('started');
|
|
120
126
|
logger.debug(`AI Engine: Step: ${step.name}`);
|
|
121
127
|
if ('prompt' in step) {
|
|
122
|
-
await runStep(step, messages);
|
|
128
|
+
const stepTrace = await runStep(step, messages);
|
|
129
|
+
trace.steps[step.name] = stepTrace;
|
|
123
130
|
}
|
|
124
131
|
else {
|
|
125
132
|
await runDumbStep(step, messages);
|
|
@@ -127,7 +134,10 @@ var AIEngine;
|
|
|
127
134
|
await action('completed');
|
|
128
135
|
}
|
|
129
136
|
}
|
|
130
|
-
return
|
|
137
|
+
return {
|
|
138
|
+
reply: shouldRun ? messages.getProposedReply() : null,
|
|
139
|
+
trace
|
|
140
|
+
};
|
|
131
141
|
},
|
|
132
142
|
rewindTo: (step) => {
|
|
133
143
|
const index = steps.indexOf(step);
|
|
@@ -147,19 +157,21 @@ var AIEngine;
|
|
|
147
157
|
if (!apiKey) {
|
|
148
158
|
throw new Error('OpenAI API key is not set');
|
|
149
159
|
}
|
|
160
|
+
const stepTrace = {};
|
|
150
161
|
try {
|
|
162
|
+
stepTrace.receivedContext = step.context;
|
|
151
163
|
let response = null;
|
|
152
164
|
let prompt = typeof step.prompt === 'string' ? step.prompt : await step.prompt.content();
|
|
165
|
+
stepTrace.receivedPrompt = prompt;
|
|
153
166
|
logger.debug('AI Engine: context', step.context);
|
|
154
167
|
logger.debug('AI Engine: messages', messages.toString(step.ignoreDirectives || false));
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
168
|
+
nunjucks_1.default.configure({
|
|
169
|
+
autoescape: true,
|
|
170
|
+
trimBlocks: true,
|
|
171
|
+
lstripBlocks: true,
|
|
172
|
+
});
|
|
173
|
+
prompt = nunjucks_1.default.renderString(prompt, step.context || {});
|
|
174
|
+
stepTrace.renderedPrompt = prompt;
|
|
163
175
|
response = await runLLM(apiKey, prompt, messages.toString(step.ignoreDirectives || false), step.schema, step.model);
|
|
164
176
|
if (!response) {
|
|
165
177
|
throw new Error('No response from OpenAI');
|
|
@@ -180,11 +192,13 @@ var AIEngine;
|
|
|
180
192
|
logger.debug(`AI Engine: replying`);
|
|
181
193
|
await step.execute(response);
|
|
182
194
|
}
|
|
195
|
+
return stepTrace;
|
|
183
196
|
}
|
|
184
197
|
catch (error) {
|
|
185
198
|
// FIXME: this doesn't terminate the workflow
|
|
186
199
|
await step.onError(error.message);
|
|
187
200
|
shouldRun = false;
|
|
201
|
+
return stepTrace;
|
|
188
202
|
}
|
|
189
203
|
}
|
|
190
204
|
async function runDumbStep(step, messages) {
|
package/build/lib/schedule.d.ts
CHANGED
|
@@ -3,6 +3,29 @@
|
|
|
3
3
|
* - note that Delay must not be negative
|
|
4
4
|
*/
|
|
5
5
|
export declare function delayFactory(schedule: Schedule): (delay: Delay) => Date;
|
|
6
|
+
/**
|
|
7
|
+
* Query over an object that follows {@link Schedule} interface
|
|
8
|
+
*/
|
|
9
|
+
export declare class ScheduleQuery {
|
|
10
|
+
private schedule;
|
|
11
|
+
constructor(schedule: Schedule);
|
|
12
|
+
/**
|
|
13
|
+
* Find next closest date after specified delay within the schedule
|
|
14
|
+
*/
|
|
15
|
+
nextValidDate(delay: Delay): Date;
|
|
16
|
+
/**
|
|
17
|
+
* Finds next closest date that follows a specified date within the schedule
|
|
18
|
+
*/
|
|
19
|
+
nextValidDate(date: Date): Date;
|
|
20
|
+
/** Returns next date the schedule starting from _now_ */
|
|
21
|
+
next(): Date;
|
|
22
|
+
/**
|
|
23
|
+
* Checks if a specified date is within the schedule,
|
|
24
|
+
* if no date provided, checks if _now_ is within the schedule
|
|
25
|
+
*/
|
|
26
|
+
isValid(date: Date): boolean;
|
|
27
|
+
}
|
|
28
|
+
export declare function createScheduleQuery(schedule: Schedule): ScheduleQuery;
|
|
6
29
|
type Delay = [number, 'minutes' | 'hours' | 'days'] | [number, 'hours', number, 'minutes'] | [number, 'days', number, 'hours'] | [number, 'days', number, 'hours', number, 'minutes'];
|
|
7
30
|
type singleInt = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9;
|
|
8
31
|
type hours = `${0 | 1}${singleInt}` | '20' | '21' | '22' | '23';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/lib/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,WACH,KAAK,KAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/lib/schedule.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,WACH,KAAK,KAAG,IAAI,CAGvD;AAED;;GAEG;AACH,qBAAa,aAAa;IACV,OAAO,CAAC,QAAQ;gBAAR,QAAQ,EAAE,QAAQ;IAEtC;;OAEG;IACH,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAEjC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAuC/B,0DAA0D;IAC1D,IAAI;IAIJ;;;OAGG;IACH,OAAO,CAAC,IAAI,EAAE,IAAI;CAIrB;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,iBAErD;AAiFD,KAAK,KAAK,GACJ,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,MAAM,CAAC,GACtC,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,GACpC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,GACjC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAA;AAE1D,KAAK,SAAS,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACtD,KAAK,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC/D,KAAK,IAAI,GAAG,GAAG,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAA;AAC3D,KAAK,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,QAAQ,CAAA;AAClG,KAAK,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAC1D,KAAK,KAAK,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAA;AAE9F,KAAK,OAAO,GAAG,GAAG,IAAI,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,CAAA;AAE9D,UAAU,SAAS;IACf,IAAI,EAAE,QAAQ,EAAE,CAAA;IAChB,IAAI,EAAE,IAAI,CAAA;IACV,EAAE,EAAE,IAAI,CAAA;CACX;AAED,MAAM,WAAW,QAAQ;IACrB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,CAAC,EAAE,SAAS,EAAE,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAA;CACvB"}
|
package/build/lib/schedule.js
CHANGED
|
@@ -1,37 +1,65 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScheduleQuery = void 0;
|
|
3
4
|
exports.delayFactory = delayFactory;
|
|
5
|
+
exports.createScheduleQuery = createScheduleQuery;
|
|
4
6
|
/**
|
|
5
7
|
* @returns getNextTimePoint function that makes a date from a given {@link Delay}
|
|
6
8
|
* - note that Delay must not be negative
|
|
7
9
|
*/
|
|
8
10
|
function delayFactory(schedule) {
|
|
9
11
|
return function getNextTimePoint(delay) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
return createScheduleQuery(schedule).nextValidDate(delay);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Query over an object that follows {@link Schedule} interface
|
|
17
|
+
*/
|
|
18
|
+
class ScheduleQuery {
|
|
19
|
+
schedule;
|
|
20
|
+
constructor(schedule) {
|
|
21
|
+
this.schedule = schedule;
|
|
22
|
+
}
|
|
23
|
+
nextValidDate(dateOrDelay) {
|
|
24
|
+
const date = dateOrDelay instanceof Date ? dateOrDelay : new Date();
|
|
25
|
+
const [_, offsetDiffBefore] = convertToTimeZone(date, this.schedule.timeZone);
|
|
14
26
|
const localOffsetBefore = date.getTimezoneOffset() * 60 * 1000;
|
|
15
|
-
|
|
16
|
-
|
|
27
|
+
if (!(dateOrDelay instanceof Date)) {
|
|
28
|
+
const delayMs = getDelayTimeInMs(dateOrDelay);
|
|
29
|
+
date.setTime(date.getTime() + delayMs);
|
|
30
|
+
}
|
|
31
|
+
let [targetTzDate, offsetDiff] = convertToTimeZone(date, this.schedule.timeZone);
|
|
17
32
|
const localOffsetAfterMs = targetTzDate.getTimezoneOffset() * 60 * 1000;
|
|
18
33
|
const localOffsetChange = localOffsetAfterMs - localOffsetBefore;
|
|
19
34
|
const targetTzOffsetChange = offsetDiff - offsetDiffBefore;
|
|
20
|
-
if (workingHours && workingHours?.length > 0) {
|
|
21
|
-
targetTzDate = getNextWorkingDate(targetTzDate,
|
|
22
|
-
}
|
|
23
|
-
if (holidays && isHoliday(targetTzDate, holidays)) {
|
|
24
|
-
targetTzDate = skipHoliday(targetTzDate, holidays);
|
|
35
|
+
if (this.schedule.workingHours && this.schedule.workingHours?.length > 0) {
|
|
36
|
+
targetTzDate = getNextWorkingDate(targetTzDate, this.schedule);
|
|
25
37
|
}
|
|
26
38
|
const targetDate = new Date(targetTzDate.getTime() + offsetDiff + targetTzOffsetChange + localOffsetChange);
|
|
27
|
-
const [, offsetDiffTz] = convertToTimeZone(targetDate, timeZone);
|
|
39
|
+
const [, offsetDiffTz] = convertToTimeZone(targetDate, this.schedule.timeZone);
|
|
28
40
|
const targetOffsetTzChange = offsetDiffTz - offsetDiff;
|
|
29
41
|
return new Date(targetTzDate.getTime() +
|
|
30
42
|
offsetDiff +
|
|
31
43
|
targetTzOffsetChange +
|
|
32
44
|
localOffsetChange +
|
|
33
45
|
targetOffsetTzChange);
|
|
34
|
-
}
|
|
46
|
+
}
|
|
47
|
+
/** Returns next date the schedule starting from _now_ */
|
|
48
|
+
next() {
|
|
49
|
+
return this.nextValidDate(new Date());
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Checks if a specified date is within the schedule,
|
|
53
|
+
* if no date provided, checks if _now_ is within the schedule
|
|
54
|
+
*/
|
|
55
|
+
isValid(date) {
|
|
56
|
+
const next = this.nextValidDate(date);
|
|
57
|
+
return date.toISOString() === next.toISOString();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
exports.ScheduleQuery = ScheduleQuery;
|
|
61
|
+
function createScheduleQuery(schedule) {
|
|
62
|
+
return new ScheduleQuery(schedule);
|
|
35
63
|
}
|
|
36
64
|
function getDelayTimeInMs(time) {
|
|
37
65
|
const minutesIndex = time.findIndex((el) => el === 'minutes');
|
|
@@ -50,12 +78,13 @@ function convertToTimeZone(date, timeZone) {
|
|
|
50
78
|
const offsetMS = date.getTime() - convertedDate.getTime();
|
|
51
79
|
return [convertedDate, offsetMS];
|
|
52
80
|
}
|
|
53
|
-
function getNextWorkingDate(date,
|
|
81
|
+
function getNextWorkingDate(date, schedule) {
|
|
54
82
|
const currentDate = new Date(date);
|
|
55
83
|
while (true) {
|
|
56
84
|
const currentDay = getDayOfWeek(currentDate);
|
|
57
|
-
const daySchedule = workingHours.find((interval) => interval.days.includes(currentDay));
|
|
58
|
-
|
|
85
|
+
const daySchedule = schedule.workingHours.find((interval) => interval.days.includes(currentDay));
|
|
86
|
+
const holiday = schedule.holidays && isHoliday(currentDate, schedule);
|
|
87
|
+
if (daySchedule && !holiday) {
|
|
59
88
|
const [fromHours, fromMinutes] = daySchedule.from.split(':').map(Number);
|
|
60
89
|
const [toHours, toMinutes] = daySchedule.to.split(':').map(Number);
|
|
61
90
|
if (fromHours > toHours) {
|
|
@@ -88,13 +117,11 @@ function getDayOfWeek(date) {
|
|
|
88
117
|
];
|
|
89
118
|
return days[date.getDay()];
|
|
90
119
|
}
|
|
91
|
-
function isHoliday(date,
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
}
|
|
99
|
-
return date;
|
|
120
|
+
function isHoliday(date, schedule) {
|
|
121
|
+
if (!schedule.holidays)
|
|
122
|
+
return false;
|
|
123
|
+
const offset = date.getTimezoneOffset();
|
|
124
|
+
const utcDate = new Date(date.getTime() - offset * 60 * 1000);
|
|
125
|
+
const dateString = utcDate.toISOString().split('T')[0];
|
|
126
|
+
return schedule.holidays.includes(dateString);
|
|
100
127
|
}
|
package/changelog.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
### 0.3.2 → 0.4.o (unstable)
|
|
4
|
+
|
|
5
|
+
Breaking changes:
|
|
6
|
+
|
|
7
|
+
- `await workflow.run()` now returns an object with `reply: string` and `trace` object
|
|
8
|
+
|
|
9
|
+
### 0.3.1 → 0.3.2 (unstable)
|
|
10
|
+
|
|
11
|
+
- add `ScheduleQuery` class that provides three additional capabilities compared to `delayFactory`:
|
|
12
|
+
- `query.nextValidDate(date: Date)` – to find next closest date after a specific date (rather than delay)
|
|
13
|
+
- `query.next()` – gets closest date within provided schedule
|
|
14
|
+
- `query.isValid(date)` – checks if provided date is within the schedule
|
|
15
|
+
|
|
3
16
|
### 0.3.0 → 0.3.1 (unstable)
|
|
4
17
|
|
|
5
18
|
- Fix: allow other models (as a string)
|
package/package.json
CHANGED
package/readme.md
CHANGED
|
@@ -60,7 +60,7 @@ const myCoordinator = engine.createStep({
|
|
|
60
60
|
|
|
61
61
|
// Create and run workflow
|
|
62
62
|
const workflow = await engine.createWorkflow(mainStep, myReviewer, myCoordinator)
|
|
63
|
-
const
|
|
63
|
+
const { reply, trace } = await workflow.run(messages)
|
|
64
64
|
```
|
|
65
65
|
|
|
66
66
|
## Main concepts
|