@devramps/sdk-typescript 0.1.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/LICENSE +21 -0
- package/README.md +461 -0
- package/dist/base/base-step.d.ts +41 -0
- package/dist/base/base-step.js +38 -0
- package/dist/base/polling-step.d.ts +85 -0
- package/dist/base/polling-step.js +80 -0
- package/dist/base/requires-approval-step.d.ts +5 -0
- package/dist/base/requires-approval-step.js +8 -0
- package/dist/base/simple-step.d.ts +51 -0
- package/dist/base/simple-step.js +52 -0
- package/dist/decorators/step.d.ts +24 -0
- package/dist/decorators/step.js +45 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +35 -0
- package/dist/logging/step-logger.d.ts +35 -0
- package/dist/logging/step-logger.js +94 -0
- package/dist/output/step-output.d.ts +286 -0
- package/dist/output/step-output.js +108 -0
- package/dist/registry/step-registry.d.ts +93 -0
- package/dist/registry/step-registry.js +238 -0
- package/dist/types.d.ts +1 -0
- package/dist/types.js +3 -0
- package/package.json +70 -0
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PollingStep = void 0;
|
|
4
|
+
const base_step_1 = require("./base-step");
|
|
5
|
+
/**
|
|
6
|
+
* A polling step for long-running operations that need status checks.
|
|
7
|
+
*
|
|
8
|
+
* Users extend this class and implement:
|
|
9
|
+
* - `trigger(params)` - Start the operation, return initial polling state
|
|
10
|
+
* - `poll(params, pollingState)` - Check status, return POLL_AGAIN, SUCCESS, or FAILED
|
|
11
|
+
*
|
|
12
|
+
* Optionally override `prepare` to require approval before triggering.
|
|
13
|
+
*
|
|
14
|
+
* @typeParam TParams - The input parameters type (validated by schema)
|
|
15
|
+
* @typeParam TPollingState - The polling state type passed between poll calls
|
|
16
|
+
*
|
|
17
|
+
* @example
|
|
18
|
+
* ```typescript
|
|
19
|
+
* type JobParams = { target: string };
|
|
20
|
+
* type JobPollingState = { jobId: string; startedAt: number };
|
|
21
|
+
*
|
|
22
|
+
* @Step({ name: "Long Job", type: "long-job", schema: jobSchema })
|
|
23
|
+
* class LongJobStep extends PollingStep<JobParams, JobPollingState> {
|
|
24
|
+
* async trigger(params: JobParams): Promise<TriggerOutput<JobPollingState>> {
|
|
25
|
+
* const jobId = await startJob(params);
|
|
26
|
+
* return StepOutputs.triggered({ jobId, startedAt: Date.now() });
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* async poll(params: JobParams, state: JobPollingState): Promise<PollOutput<JobPollingState>> {
|
|
30
|
+
* const status = await checkJob(state.jobId);
|
|
31
|
+
* if (status === "running") {
|
|
32
|
+
* return StepOutputs.pollAgain(state, 5000);
|
|
33
|
+
* }
|
|
34
|
+
* return StepOutputs.success({ result: status });
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*
|
|
39
|
+
* @example With approval
|
|
40
|
+
* ```typescript
|
|
41
|
+
* @Step({ name: "Dangerous Job", type: "dangerous-job", schema: dangerousSchema })
|
|
42
|
+
* class DangerousJobStep extends PollingStep<DangerousParams, DangerousPollingState> {
|
|
43
|
+
* async prepare(params: DangerousParams): Promise<PrepareOutput> {
|
|
44
|
+
* return StepOutputs.approvalRequired({
|
|
45
|
+
* message: `Run dangerous job on ${params.target}?`,
|
|
46
|
+
* });
|
|
47
|
+
* }
|
|
48
|
+
*
|
|
49
|
+
* async trigger(params: DangerousParams, approval: ApprovalContext): Promise<TriggerOutput<DangerousPollingState>> {
|
|
50
|
+
* const jobId = await startDangerousJob(params);
|
|
51
|
+
* return StepOutputs.triggered({ jobId });
|
|
52
|
+
* }
|
|
53
|
+
*
|
|
54
|
+
* async poll(params: DangerousParams, state: DangerousPollingState): Promise<PollOutput<DangerousPollingState>> {
|
|
55
|
+
* // ... check status
|
|
56
|
+
* }
|
|
57
|
+
* }
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
class PollingStep extends base_step_1.BaseStep {
|
|
61
|
+
/**
|
|
62
|
+
* Called by the registry to execute the trigger phase.
|
|
63
|
+
* @internal
|
|
64
|
+
*/
|
|
65
|
+
async executeTrigger(params, approval) {
|
|
66
|
+
return this.trigger(params, approval);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Called by the registry to execute the poll phase.
|
|
70
|
+
* @internal
|
|
71
|
+
*/
|
|
72
|
+
async executePoll(params, pollingState) {
|
|
73
|
+
return this.poll(params, pollingState);
|
|
74
|
+
}
|
|
75
|
+
getMetadata() {
|
|
76
|
+
throw new Error("getMetadata not implemented. Did you forget to add the @Step decorator?");
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
exports.PollingStep = PollingStep;
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9sbGluZy1zdGVwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Jhc2UvcG9sbGluZy1zdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLDJDQUF1QztBQVF2Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0RHO0FBQ0gsTUFBc0IsV0FHcEIsU0FBUSxvQkFBaUI7SUF1QnpCOzs7T0FHRztJQUNILEtBQUssQ0FBQyxjQUFjLENBQ2xCLE1BQWUsRUFDZixRQUEwQjtRQUUxQixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsV0FBVyxDQUNmLE1BQWUsRUFDZixZQUEyQjtRQUUzQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxXQUFXO1FBQ1QsTUFBTSxJQUFJLEtBQUssQ0FDYix5RUFBeUUsQ0FDMUUsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXJERCxrQ0FxREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0ZXBNZXRhZGF0YSB9IGZyb20gXCIuL2Jhc2Utc3RlcFwiO1xuaW1wb3J0IHsgQmFzZVN0ZXAgfSBmcm9tIFwiLi9iYXNlLXN0ZXBcIjtcbmltcG9ydCB0eXBlIHtcbiAgQXBwcm92YWxDb250ZXh0LFxuICBQb2xsT3V0cHV0LFxuICBTdGVwT3V0cHV0LFxuICBUcmlnZ2VyT3V0cHV0LFxufSBmcm9tIFwiLi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5cbi8qKlxuICogQSBwb2xsaW5nIHN0ZXAgZm9yIGxvbmctcnVubmluZyBvcGVyYXRpb25zIHRoYXQgbmVlZCBzdGF0dXMgY2hlY2tzLlxuICpcbiAqIFVzZXJzIGV4dGVuZCB0aGlzIGNsYXNzIGFuZCBpbXBsZW1lbnQ6XG4gKiAtIGB0cmlnZ2VyKHBhcmFtcylgIC0gU3RhcnQgdGhlIG9wZXJhdGlvbiwgcmV0dXJuIGluaXRpYWwgcG9sbGluZyBzdGF0ZVxuICogLSBgcG9sbChwYXJhbXMsIHBvbGxpbmdTdGF0ZSlgIC0gQ2hlY2sgc3RhdHVzLCByZXR1cm4gUE9MTF9BR0FJTiwgU1VDQ0VTUywgb3IgRkFJTEVEXG4gKlxuICogT3B0aW9uYWxseSBvdmVycmlkZSBgcHJlcGFyZWAgdG8gcmVxdWlyZSBhcHByb3ZhbCBiZWZvcmUgdHJpZ2dlcmluZy5cbiAqXG4gKiBAdHlwZVBhcmFtIFRQYXJhbXMgLSBUaGUgaW5wdXQgcGFyYW1ldGVycyB0eXBlICh2YWxpZGF0ZWQgYnkgc2NoZW1hKVxuICogQHR5cGVQYXJhbSBUUG9sbGluZ1N0YXRlIC0gVGhlIHBvbGxpbmcgc3RhdGUgdHlwZSBwYXNzZWQgYmV0d2VlbiBwb2xsIGNhbGxzXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHR5cGUgSm9iUGFyYW1zID0geyB0YXJnZXQ6IHN0cmluZyB9O1xuICogdHlwZSBKb2JQb2xsaW5nU3RhdGUgPSB7IGpvYklkOiBzdHJpbmc7IHN0YXJ0ZWRBdDogbnVtYmVyIH07XG4gKlxuICogQFN0ZXAoeyBuYW1lOiBcIkxvbmcgSm9iXCIsIHR5cGU6IFwibG9uZy1qb2JcIiwgc2NoZW1hOiBqb2JTY2hlbWEgfSlcbiAqIGNsYXNzIExvbmdKb2JTdGVwIGV4dGVuZHMgUG9sbGluZ1N0ZXA8Sm9iUGFyYW1zLCBKb2JQb2xsaW5nU3RhdGU+IHtcbiAqICAgYXN5bmMgdHJpZ2dlcihwYXJhbXM6IEpvYlBhcmFtcyk6IFByb21pc2U8VHJpZ2dlck91dHB1dDxKb2JQb2xsaW5nU3RhdGU+PiB7XG4gKiAgICAgY29uc3Qgam9iSWQgPSBhd2FpdCBzdGFydEpvYihwYXJhbXMpO1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy50cmlnZ2VyZWQoeyBqb2JJZCwgc3RhcnRlZEF0OiBEYXRlLm5vdygpIH0pO1xuICogICB9XG4gKlxuICogICBhc3luYyBwb2xsKHBhcmFtczogSm9iUGFyYW1zLCBzdGF0ZTogSm9iUG9sbGluZ1N0YXRlKTogUHJvbWlzZTxQb2xsT3V0cHV0PEpvYlBvbGxpbmdTdGF0ZT4+IHtcbiAqICAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBjaGVja0pvYihzdGF0ZS5qb2JJZCk7XG4gKiAgICAgaWYgKHN0YXR1cyA9PT0gXCJydW5uaW5nXCIpIHtcbiAqICAgICAgIHJldHVybiBTdGVwT3V0cHV0cy5wb2xsQWdhaW4oc3RhdGUsIDUwMDApO1xuICogICAgIH1cbiAqICAgICByZXR1cm4gU3RlcE91dHB1dHMuc3VjY2Vzcyh7IHJlc3VsdDogc3RhdHVzIH0pO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZSBXaXRoIGFwcHJvdmFsXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAU3RlcCh7IG5hbWU6IFwiRGFuZ2Vyb3VzIEpvYlwiLCB0eXBlOiBcImRhbmdlcm91cy1qb2JcIiwgc2NoZW1hOiBkYW5nZXJvdXNTY2hlbWEgfSlcbiAqIGNsYXNzIERhbmdlcm91c0pvYlN0ZXAgZXh0ZW5kcyBQb2xsaW5nU3RlcDxEYW5nZXJvdXNQYXJhbXMsIERhbmdlcm91c1BvbGxpbmdTdGF0ZT4ge1xuICogICBhc3luYyBwcmVwYXJlKHBhcmFtczogRGFuZ2Vyb3VzUGFyYW1zKTogUHJvbWlzZTxQcmVwYXJlT3V0cHV0PiB7XG4gKiAgICAgcmV0dXJuIFN0ZXBPdXRwdXRzLmFwcHJvdmFsUmVxdWlyZWQoe1xuICogICAgICAgbWVzc2FnZTogYFJ1biBkYW5nZXJvdXMgam9iIG9uICR7cGFyYW1zLnRhcmdldH0/YCxcbiAqICAgICB9KTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgdHJpZ2dlcihwYXJhbXM6IERhbmdlcm91c1BhcmFtcywgYXBwcm92YWw6IEFwcHJvdmFsQ29udGV4dCk6IFByb21pc2U8VHJpZ2dlck91dHB1dDxEYW5nZXJvdXNQb2xsaW5nU3RhdGU+PiB7XG4gKiAgICAgY29uc3Qgam9iSWQgPSBhd2FpdCBzdGFydERhbmdlcm91c0pvYihwYXJhbXMpO1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy50cmlnZ2VyZWQoeyBqb2JJZCB9KTtcbiAqICAgfVxuICpcbiAqICAgYXN5bmMgcG9sbChwYXJhbXM6IERhbmdlcm91c1BhcmFtcywgc3RhdGU6IERhbmdlcm91c1BvbGxpbmdTdGF0ZSk6IFByb21pc2U8UG9sbE91dHB1dDxEYW5nZXJvdXNQb2xsaW5nU3RhdGU+PiB7XG4gKiAgICAgLy8gLi4uIGNoZWNrIHN0YXR1c1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvbGxpbmdTdGVwPFxuICBUUGFyYW1zLFxuICBUUG9sbGluZ1N0YXRlIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuPiBleHRlbmRzIEJhc2VTdGVwPFRQYXJhbXM+IHtcbiAgLyoqXG4gICAqIFN0YXJ0IHRoZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHZhbGlkYXRlZCBpbnB1dCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBhcHByb3ZhbCAtIEFwcHJvdmFsIGNvbnRleHQgaWYgdGhpcyBzdGVwIHJlcXVpcmVzIGFwcHJvdmFsIChoYXMgcHJlcGFyZSBtZXRob2QpXG4gICAqIEByZXR1cm5zIFRSSUdHRVJFRCB3aXRoIGluaXRpYWwgcG9sbGluZyBzdGF0ZSwgb3IgRkFJTEVEXG4gICAqL1xuICBhYnN0cmFjdCB0cmlnZ2VyKFxuICAgIHBhcmFtczogVFBhcmFtcyxcbiAgICBhcHByb3ZhbD86IEFwcHJvdmFsQ29udGV4dFxuICApOiBQcm9taXNlPFRyaWdnZXJPdXRwdXQ8VFBvbGxpbmdTdGF0ZT4+O1xuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgb3JpZ2luYWwgaW5wdXQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gcG9sbGluZ1N0YXRlIC0gU3RhdGUgZnJvbSBwcmV2aW91cyB0cmlnZ2VyKCkgb3IgcG9sbCgpIGNhbGxcbiAgICogQHJldHVybnMgUE9MTF9BR0FJTiB3aXRoIHVwZGF0ZWQgc3RhdGUsIFNVQ0NFU1MsIG9yIEZBSUxFRFxuICAgKi9cbiAgYWJzdHJhY3QgcG9sbChcbiAgICBwYXJhbXM6IFRQYXJhbXMsXG4gICAgcG9sbGluZ1N0YXRlOiBUUG9sbGluZ1N0YXRlXG4gICk6IFByb21pc2U8UG9sbE91dHB1dDxUUG9sbGluZ1N0YXRlPj47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgcmVnaXN0cnkgdG8gZXhlY3V0ZSB0aGUgdHJpZ2dlciBwaGFzZS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBhc3luYyBleGVjdXRlVHJpZ2dlcihcbiAgICBwYXJhbXM6IFRQYXJhbXMsXG4gICAgYXBwcm92YWw/OiBBcHByb3ZhbENvbnRleHRcbiAgKTogUHJvbWlzZTxTdGVwT3V0cHV0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJpZ2dlcihwYXJhbXMsIGFwcHJvdmFsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHJlZ2lzdHJ5IHRvIGV4ZWN1dGUgdGhlIHBvbGwgcGhhc2UuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZVBvbGwoXG4gICAgcGFyYW1zOiBUUGFyYW1zLFxuICAgIHBvbGxpbmdTdGF0ZTogVFBvbGxpbmdTdGF0ZVxuICApOiBQcm9taXNlPFN0ZXBPdXRwdXQ+IHtcbiAgICByZXR1cm4gdGhpcy5wb2xsKHBhcmFtcywgcG9sbGluZ1N0YXRlKTtcbiAgfVxuXG4gIGdldE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJnZXRNZXRhZGF0YSBub3QgaW1wbGVtZW50ZWQuIERpZCB5b3UgZm9yZ2V0IHRvIGFkZCB0aGUgQFN0ZXAgZGVjb3JhdG9yP1wiXG4gICAgKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequiresApprovalStep = void 0;
|
|
4
|
+
const base_step_1 = require("./base-step");
|
|
5
|
+
class RequiresApprovalStep extends base_step_1.BaseStep {
|
|
6
|
+
}
|
|
7
|
+
exports.RequiresApprovalStep = RequiresApprovalStep;
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWlyZXMtYXBwcm92YWwtc3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iYXNlL3JlcXVpcmVzLWFwcHJvdmFsLXN0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXVDO0FBRXZDLE1BQXNCLG9CQUF3QixTQUFRLG9CQUFXO0NBR2hFO0FBSEQsb0RBR0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlU3RlcCB9IGZyb20gXCIuL2Jhc2Utc3RlcFwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVxdWlyZXNBcHByb3ZhbFN0ZXA8VD4gZXh0ZW5kcyBCYXNlU3RlcDxUPiB7XG4gIGFic3RyYWN0IHJ1bigpOiBQcm9taXNlPHZvaWQ+O1xuICBhYnN0cmFjdCBydW5BZnRlckFwcHJvdmFsKCk6IFByb21pc2U8dm9pZD47XG59XG4iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { StepMetadata } from "./base-step";
|
|
2
|
+
import { BaseStep } from "./base-step";
|
|
3
|
+
import type { ApprovalContext, RunOutput, StepOutput } from "../output/step-output";
|
|
4
|
+
/**
|
|
5
|
+
* A simple step that runs once with the provided params.
|
|
6
|
+
*
|
|
7
|
+
* Users extend this class and implement the `run` method.
|
|
8
|
+
* Optionally override `prepare` to require approval before execution.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* @Step({ name: "Deploy", type: "deploy", schema: deploySchema })
|
|
13
|
+
* class DeployStep extends SimpleStep<DeployParams> {
|
|
14
|
+
* async run(params: DeployParams): Promise<RunOutput> {
|
|
15
|
+
* this.logger.info("Deploying", { target: params.target });
|
|
16
|
+
* return StepOutputs.success({ deploymentId: "123" });
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @example With approval
|
|
22
|
+
* ```typescript
|
|
23
|
+
* @Step({ name: "Delete User", type: "delete-user", schema: deleteUserSchema })
|
|
24
|
+
* class DeleteUserStep extends SimpleStep<DeleteUserParams> {
|
|
25
|
+
* async prepare(params: DeleteUserParams): Promise<PrepareOutput> {
|
|
26
|
+
* return StepOutputs.approvalRequired({
|
|
27
|
+
* message: `Delete user ${params.userId}?`,
|
|
28
|
+
* });
|
|
29
|
+
* }
|
|
30
|
+
*
|
|
31
|
+
* async run(params: DeleteUserParams, approval: ApprovalContext): Promise<RunOutput> {
|
|
32
|
+
* this.logger.info("Deleting user", { approvedBy: approval.approverId });
|
|
33
|
+
* return StepOutputs.success();
|
|
34
|
+
* }
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare abstract class SimpleStep<TParams> extends BaseStep<TParams> {
|
|
39
|
+
/**
|
|
40
|
+
* Execute the step logic.
|
|
41
|
+
* @param params - The validated input parameters
|
|
42
|
+
* @param approval - Approval context if this step requires approval (has prepare method)
|
|
43
|
+
*/
|
|
44
|
+
abstract run(params: TParams, approval?: ApprovalContext): Promise<RunOutput>;
|
|
45
|
+
/**
|
|
46
|
+
* Called by the registry to execute this step.
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
execute(params: TParams, approval?: ApprovalContext): Promise<StepOutput>;
|
|
50
|
+
getMetadata(): StepMetadata;
|
|
51
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SimpleStep = void 0;
|
|
4
|
+
const base_step_1 = require("./base-step");
|
|
5
|
+
/**
|
|
6
|
+
* A simple step that runs once with the provided params.
|
|
7
|
+
*
|
|
8
|
+
* Users extend this class and implement the `run` method.
|
|
9
|
+
* Optionally override `prepare` to require approval before execution.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* @Step({ name: "Deploy", type: "deploy", schema: deploySchema })
|
|
14
|
+
* class DeployStep extends SimpleStep<DeployParams> {
|
|
15
|
+
* async run(params: DeployParams): Promise<RunOutput> {
|
|
16
|
+
* this.logger.info("Deploying", { target: params.target });
|
|
17
|
+
* return StepOutputs.success({ deploymentId: "123" });
|
|
18
|
+
* }
|
|
19
|
+
* }
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* @example With approval
|
|
23
|
+
* ```typescript
|
|
24
|
+
* @Step({ name: "Delete User", type: "delete-user", schema: deleteUserSchema })
|
|
25
|
+
* class DeleteUserStep extends SimpleStep<DeleteUserParams> {
|
|
26
|
+
* async prepare(params: DeleteUserParams): Promise<PrepareOutput> {
|
|
27
|
+
* return StepOutputs.approvalRequired({
|
|
28
|
+
* message: `Delete user ${params.userId}?`,
|
|
29
|
+
* });
|
|
30
|
+
* }
|
|
31
|
+
*
|
|
32
|
+
* async run(params: DeleteUserParams, approval: ApprovalContext): Promise<RunOutput> {
|
|
33
|
+
* this.logger.info("Deleting user", { approvedBy: approval.approverId });
|
|
34
|
+
* return StepOutputs.success();
|
|
35
|
+
* }
|
|
36
|
+
* }
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
class SimpleStep extends base_step_1.BaseStep {
|
|
40
|
+
/**
|
|
41
|
+
* Called by the registry to execute this step.
|
|
42
|
+
* @internal
|
|
43
|
+
*/
|
|
44
|
+
async execute(params, approval) {
|
|
45
|
+
return this.run(params, approval);
|
|
46
|
+
}
|
|
47
|
+
getMetadata() {
|
|
48
|
+
throw new Error("getMetadata not implemented. Did you forget to add the @Step decorator?");
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
exports.SimpleStep = SimpleStep;
|
|
52
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxlLXN0ZXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYmFzZS9zaW1wbGUtc3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSwyQ0FBdUM7QUFHdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILE1BQXNCLFVBQW9CLFNBQVEsb0JBQWlCO0lBUWpFOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBZSxFQUFFLFFBQTBCO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLElBQUksS0FBSyxDQUNiLHlFQUF5RSxDQUMxRSxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBckJELGdDQXFCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3RlcE1ldGFkYXRhIH0gZnJvbSBcIi4vYmFzZS1zdGVwXCI7XG5pbXBvcnQgeyBCYXNlU3RlcCB9IGZyb20gXCIuL2Jhc2Utc3RlcFwiO1xuaW1wb3J0IHR5cGUgeyBBcHByb3ZhbENvbnRleHQsIFJ1bk91dHB1dCwgU3RlcE91dHB1dCB9IGZyb20gXCIuLi9vdXRwdXQvc3RlcC1vdXRwdXRcIjtcblxuLyoqXG4gKiBBIHNpbXBsZSBzdGVwIHRoYXQgcnVucyBvbmNlIHdpdGggdGhlIHByb3ZpZGVkIHBhcmFtcy5cbiAqXG4gKiBVc2VycyBleHRlbmQgdGhpcyBjbGFzcyBhbmQgaW1wbGVtZW50IHRoZSBgcnVuYCBtZXRob2QuXG4gKiBPcHRpb25hbGx5IG92ZXJyaWRlIGBwcmVwYXJlYCB0byByZXF1aXJlIGFwcHJvdmFsIGJlZm9yZSBleGVjdXRpb24uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBTdGVwKHsgbmFtZTogXCJEZXBsb3lcIiwgdHlwZTogXCJkZXBsb3lcIiwgc2NoZW1hOiBkZXBsb3lTY2hlbWEgfSlcbiAqIGNsYXNzIERlcGxveVN0ZXAgZXh0ZW5kcyBTaW1wbGVTdGVwPERlcGxveVBhcmFtcz4ge1xuICogICBhc3luYyBydW4ocGFyYW1zOiBEZXBsb3lQYXJhbXMpOiBQcm9taXNlPFJ1bk91dHB1dD4ge1xuICogICAgIHRoaXMubG9nZ2VyLmluZm8oXCJEZXBsb3lpbmdcIiwgeyB0YXJnZXQ6IHBhcmFtcy50YXJnZXQgfSk7XG4gKiAgICAgcmV0dXJuIFN0ZXBPdXRwdXRzLnN1Y2Nlc3MoeyBkZXBsb3ltZW50SWQ6IFwiMTIzXCIgfSk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFdpdGggYXBwcm92YWxcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBTdGVwKHsgbmFtZTogXCJEZWxldGUgVXNlclwiLCB0eXBlOiBcImRlbGV0ZS11c2VyXCIsIHNjaGVtYTogZGVsZXRlVXNlclNjaGVtYSB9KVxuICogY2xhc3MgRGVsZXRlVXNlclN0ZXAgZXh0ZW5kcyBTaW1wbGVTdGVwPERlbGV0ZVVzZXJQYXJhbXM+IHtcbiAqICAgYXN5bmMgcHJlcGFyZShwYXJhbXM6IERlbGV0ZVVzZXJQYXJhbXMpOiBQcm9taXNlPFByZXBhcmVPdXRwdXQ+IHtcbiAqICAgICByZXR1cm4gU3RlcE91dHB1dHMuYXBwcm92YWxSZXF1aXJlZCh7XG4gKiAgICAgICBtZXNzYWdlOiBgRGVsZXRlIHVzZXIgJHtwYXJhbXMudXNlcklkfT9gLFxuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICBhc3luYyBydW4ocGFyYW1zOiBEZWxldGVVc2VyUGFyYW1zLCBhcHByb3ZhbDogQXBwcm92YWxDb250ZXh0KTogUHJvbWlzZTxSdW5PdXRwdXQ+IHtcbiAqICAgICB0aGlzLmxvZ2dlci5pbmZvKFwiRGVsZXRpbmcgdXNlclwiLCB7IGFwcHJvdmVkQnk6IGFwcHJvdmFsLmFwcHJvdmVySWQgfSk7XG4gKiAgICAgcmV0dXJuIFN0ZXBPdXRwdXRzLnN1Y2Nlc3MoKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBTaW1wbGVTdGVwPFRQYXJhbXM+IGV4dGVuZHMgQmFzZVN0ZXA8VFBhcmFtcz4ge1xuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgc3RlcCBsb2dpYy5cbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSB2YWxpZGF0ZWQgaW5wdXQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gYXBwcm92YWwgLSBBcHByb3ZhbCBjb250ZXh0IGlmIHRoaXMgc3RlcCByZXF1aXJlcyBhcHByb3ZhbCAoaGFzIHByZXBhcmUgbWV0aG9kKVxuICAgKi9cbiAgYWJzdHJhY3QgcnVuKHBhcmFtczogVFBhcmFtcywgYXBwcm92YWw/OiBBcHByb3ZhbENvbnRleHQpOiBQcm9taXNlPFJ1bk91dHB1dD47XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUgcmVnaXN0cnkgdG8gZXhlY3V0ZSB0aGlzIHN0ZXAuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgYXN5bmMgZXhlY3V0ZShwYXJhbXM6IFRQYXJhbXMsIGFwcHJvdmFsPzogQXBwcm92YWxDb250ZXh0KTogUHJvbWlzZTxTdGVwT3V0cHV0PiB7XG4gICAgcmV0dXJuIHRoaXMucnVuKHBhcmFtcywgYXBwcm92YWwpO1xuICB9XG5cbiAgZ2V0TWV0YWRhdGEoKTogU3RlcE1ldGFkYXRhIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcImdldE1ldGFkYXRhIG5vdCBpbXBsZW1lbnRlZC4gRGlkIHlvdSBmb3JnZXQgdG8gYWRkIHRoZSBAU3RlcCBkZWNvcmF0b3I/XCJcbiAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ZodType, z } from "zod";
|
|
2
|
+
import { BaseStep } from "../base/base-step";
|
|
3
|
+
export interface StepConfig<S extends ZodType> {
|
|
4
|
+
name: string;
|
|
5
|
+
type: string;
|
|
6
|
+
schema: S;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Decorator that adds metadata to a step class.
|
|
10
|
+
* This is required for all steps to be registered with StepRegistry.
|
|
11
|
+
*
|
|
12
|
+
* The decorated class must extend SimpleStep or PollingStep.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* @Step({ name: "My Step", type: "my-step", schema: mySchema })
|
|
17
|
+
* class MyStep extends SimpleStep<MyParams> {
|
|
18
|
+
* async run(params: MyParams): Promise<RunOutput> {
|
|
19
|
+
* return StepOutputs.success();
|
|
20
|
+
* }
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export declare function Step<S extends ZodType>(config: StepConfig<S>): <T extends new (...args: any[]) => BaseStep<z.infer<S>>>(Base: T) => T;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Step = Step;
|
|
4
|
+
const base_step_1 = require("../base/base-step");
|
|
5
|
+
/**
|
|
6
|
+
* Decorator that adds metadata to a step class.
|
|
7
|
+
* This is required for all steps to be registered with StepRegistry.
|
|
8
|
+
*
|
|
9
|
+
* The decorated class must extend SimpleStep or PollingStep.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* @Step({ name: "My Step", type: "my-step", schema: mySchema })
|
|
14
|
+
* class MyStep extends SimpleStep<MyParams> {
|
|
15
|
+
* async run(params: MyParams): Promise<RunOutput> {
|
|
16
|
+
* return StepOutputs.success();
|
|
17
|
+
* }
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
function Step(config) {
|
|
22
|
+
return function (Base) {
|
|
23
|
+
const Enhanced = class extends Base {
|
|
24
|
+
getMetadata() {
|
|
25
|
+
// Detect step kind by checking for PollingStep methods
|
|
26
|
+
const hasPollingMethods = "trigger" in this &&
|
|
27
|
+
typeof this.trigger === "function" &&
|
|
28
|
+
"poll" in this &&
|
|
29
|
+
typeof this.poll === "function";
|
|
30
|
+
const stepKind = hasPollingMethods ? "polling" : "simple";
|
|
31
|
+
// Check if prepare is overridden (not the default BaseStep.prepare)
|
|
32
|
+
const requiresApproval = this.prepare !== base_step_1.BaseStep.prototype.prepare;
|
|
33
|
+
return {
|
|
34
|
+
type: config.type,
|
|
35
|
+
name: config.name,
|
|
36
|
+
schema: config.schema,
|
|
37
|
+
stepKind,
|
|
38
|
+
requiresApproval,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
return Enhanced;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kZWNvcmF0b3JzL3N0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwQkEsb0JBOEJDO0FBdERELGlEQUE2QztBQVE3Qzs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFnQixJQUFJLENBQW9CLE1BQXFCO0lBQzNELE9BQU8sVUFDTCxJQUFPO1FBRVAsTUFBTSxRQUFRLEdBQUcsS0FBTSxTQUFRLElBQUk7WUFDeEIsV0FBVztnQkFDbEIsdURBQXVEO2dCQUN2RCxNQUFNLGlCQUFpQixHQUNyQixTQUFTLElBQUksSUFBSTtvQkFDakIsT0FBUSxJQUFZLENBQUMsT0FBTyxLQUFLLFVBQVU7b0JBQzNDLE1BQU0sSUFBSSxJQUFJO29CQUNkLE9BQVEsSUFBWSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUM7Z0JBRTNDLE1BQU0sUUFBUSxHQUFhLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztnQkFFcEUsb0VBQW9FO2dCQUNwRSxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxPQUFPLEtBQUssb0JBQVEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDO2dCQUVyRSxPQUFPO29CQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO29CQUNqQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07b0JBQ3JCLFFBQVE7b0JBQ1IsZ0JBQWdCO2lCQUNqQixDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUM7UUFFRixPQUFPLFFBQWEsQ0FBQztJQUN2QixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBab2RUeXBlLCB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBTdGVwS2luZCwgU3RlcE1ldGFkYXRhIH0gZnJvbSBcIi4uL2Jhc2UvYmFzZS1zdGVwXCI7XG5pbXBvcnQgeyBCYXNlU3RlcCB9IGZyb20gXCIuLi9iYXNlL2Jhc2Utc3RlcFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN0ZXBDb25maWc8UyBleHRlbmRzIFpvZFR5cGU+IHtcbiAgbmFtZTogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNjaGVtYTogUztcbn1cblxuLyoqXG4gKiBEZWNvcmF0b3IgdGhhdCBhZGRzIG1ldGFkYXRhIHRvIGEgc3RlcCBjbGFzcy5cbiAqIFRoaXMgaXMgcmVxdWlyZWQgZm9yIGFsbCBzdGVwcyB0byBiZSByZWdpc3RlcmVkIHdpdGggU3RlcFJlZ2lzdHJ5LlxuICpcbiAqIFRoZSBkZWNvcmF0ZWQgY2xhc3MgbXVzdCBleHRlbmQgU2ltcGxlU3RlcCBvciBQb2xsaW5nU3RlcC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogQFN0ZXAoeyBuYW1lOiBcIk15IFN0ZXBcIiwgdHlwZTogXCJteS1zdGVwXCIsIHNjaGVtYTogbXlTY2hlbWEgfSlcbiAqIGNsYXNzIE15U3RlcCBleHRlbmRzIFNpbXBsZVN0ZXA8TXlQYXJhbXM+IHtcbiAqICAgYXN5bmMgcnVuKHBhcmFtczogTXlQYXJhbXMpOiBQcm9taXNlPFJ1bk91dHB1dD4ge1xuICogICAgIHJldHVybiBTdGVwT3V0cHV0cy5zdWNjZXNzKCk7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gU3RlcDxTIGV4dGVuZHMgWm9kVHlwZT4oY29uZmlnOiBTdGVwQ29uZmlnPFM+KSB7XG4gIHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIG5ldyAoLi4uYXJnczogYW55W10pID0+IEJhc2VTdGVwPHouaW5mZXI8Uz4+PihcbiAgICBCYXNlOiBUXG4gICk6IFQge1xuICAgIGNvbnN0IEVuaGFuY2VkID0gY2xhc3MgZXh0ZW5kcyBCYXNlIHtcbiAgICAgIG92ZXJyaWRlIGdldE1ldGFkYXRhKCk6IFN0ZXBNZXRhZGF0YTxTPiB7XG4gICAgICAgIC8vIERldGVjdCBzdGVwIGtpbmQgYnkgY2hlY2tpbmcgZm9yIFBvbGxpbmdTdGVwIG1ldGhvZHNcbiAgICAgICAgY29uc3QgaGFzUG9sbGluZ01ldGhvZHMgPVxuICAgICAgICAgIFwidHJpZ2dlclwiIGluIHRoaXMgJiZcbiAgICAgICAgICB0eXBlb2YgKHRoaXMgYXMgYW55KS50cmlnZ2VyID09PSBcImZ1bmN0aW9uXCIgJiZcbiAgICAgICAgICBcInBvbGxcIiBpbiB0aGlzICYmXG4gICAgICAgICAgdHlwZW9mICh0aGlzIGFzIGFueSkucG9sbCA9PT0gXCJmdW5jdGlvblwiO1xuXG4gICAgICAgIGNvbnN0IHN0ZXBLaW5kOiBTdGVwS2luZCA9IGhhc1BvbGxpbmdNZXRob2RzID8gXCJwb2xsaW5nXCIgOiBcInNpbXBsZVwiO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHByZXBhcmUgaXMgb3ZlcnJpZGRlbiAobm90IHRoZSBkZWZhdWx0IEJhc2VTdGVwLnByZXBhcmUpXG4gICAgICAgIGNvbnN0IHJlcXVpcmVzQXBwcm92YWwgPSB0aGlzLnByZXBhcmUgIT09IEJhc2VTdGVwLnByb3RvdHlwZS5wcmVwYXJlO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdHlwZTogY29uZmlnLnR5cGUsXG4gICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgc2NoZW1hOiBjb25maWcuc2NoZW1hLFxuICAgICAgICAgIHN0ZXBLaW5kLFxuICAgICAgICAgIHJlcXVpcmVzQXBwcm92YWwsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBFbmhhbmNlZCBhcyBUO1xuICB9O1xufVxuIl19
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { BaseStep, StepClass, StepMetadata, StepKind } from "./base/base-step";
|
|
2
|
+
export { SimpleStep } from "./base/simple-step";
|
|
3
|
+
export { PollingStep } from "./base/polling-step";
|
|
4
|
+
export { Step, StepConfig } from "./decorators/step";
|
|
5
|
+
export { ApprovalContext, ApprovalContextSchema, PrepareOutput, RunOutput, TriggerOutput, TriggeredOutput, PollOutput, PollAgainOutput, SuccessOutput, FailedOutput, ApprovalRequiredOutput, StepOutput, PrepareOutputSchema, RunOutputSchema, TriggerOutputSchema, PollOutputSchema, StepOutputSchema, StepOutputs, } from "./output/step-output";
|
|
6
|
+
export { StepRegistry, StepRegistryInput, StepRegistryInputSchema } from "./registry/step-registry";
|
|
7
|
+
export { StepLogger, StepLoggerConfig, LogEntry, LogLevel } from "./logging/step-logger";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// =============================================================================
|
|
3
|
+
// Step SDK - Public API
|
|
4
|
+
// =============================================================================
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StepLogger = exports.StepRegistryInputSchema = exports.StepRegistry = exports.StepOutputs = exports.StepOutputSchema = exports.PollOutputSchema = exports.TriggerOutputSchema = exports.RunOutputSchema = exports.PrepareOutputSchema = exports.ApprovalContextSchema = exports.Step = exports.PollingStep = exports.SimpleStep = exports.BaseStep = void 0;
|
|
7
|
+
// Base classes for creating steps
|
|
8
|
+
var base_step_1 = require("./base/base-step");
|
|
9
|
+
Object.defineProperty(exports, "BaseStep", { enumerable: true, get: function () { return base_step_1.BaseStep; } });
|
|
10
|
+
var simple_step_1 = require("./base/simple-step");
|
|
11
|
+
Object.defineProperty(exports, "SimpleStep", { enumerable: true, get: function () { return simple_step_1.SimpleStep; } });
|
|
12
|
+
var polling_step_1 = require("./base/polling-step");
|
|
13
|
+
Object.defineProperty(exports, "PollingStep", { enumerable: true, get: function () { return polling_step_1.PollingStep; } });
|
|
14
|
+
// Decorator for adding metadata to steps
|
|
15
|
+
var step_1 = require("./decorators/step");
|
|
16
|
+
Object.defineProperty(exports, "Step", { enumerable: true, get: function () { return step_1.Step; } });
|
|
17
|
+
// Output types and helper functions
|
|
18
|
+
var step_output_1 = require("./output/step-output");
|
|
19
|
+
Object.defineProperty(exports, "ApprovalContextSchema", { enumerable: true, get: function () { return step_output_1.ApprovalContextSchema; } });
|
|
20
|
+
// Output schemas for validation
|
|
21
|
+
Object.defineProperty(exports, "PrepareOutputSchema", { enumerable: true, get: function () { return step_output_1.PrepareOutputSchema; } });
|
|
22
|
+
Object.defineProperty(exports, "RunOutputSchema", { enumerable: true, get: function () { return step_output_1.RunOutputSchema; } });
|
|
23
|
+
Object.defineProperty(exports, "TriggerOutputSchema", { enumerable: true, get: function () { return step_output_1.TriggerOutputSchema; } });
|
|
24
|
+
Object.defineProperty(exports, "PollOutputSchema", { enumerable: true, get: function () { return step_output_1.PollOutputSchema; } });
|
|
25
|
+
Object.defineProperty(exports, "StepOutputSchema", { enumerable: true, get: function () { return step_output_1.StepOutputSchema; } });
|
|
26
|
+
// Helper functions
|
|
27
|
+
Object.defineProperty(exports, "StepOutputs", { enumerable: true, get: function () { return step_output_1.StepOutputs; } });
|
|
28
|
+
// Registry for running steps
|
|
29
|
+
var step_registry_1 = require("./registry/step-registry");
|
|
30
|
+
Object.defineProperty(exports, "StepRegistry", { enumerable: true, get: function () { return step_registry_1.StepRegistry; } });
|
|
31
|
+
Object.defineProperty(exports, "StepRegistryInputSchema", { enumerable: true, get: function () { return step_registry_1.StepRegistryInputSchema; } });
|
|
32
|
+
// Logging
|
|
33
|
+
var step_logger_1 = require("./logging/step-logger");
|
|
34
|
+
Object.defineProperty(exports, "StepLogger", { enumerable: true, get: function () { return step_logger_1.StepLogger; } });
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLGdGQUFnRjtBQUNoRix3QkFBd0I7QUFDeEIsZ0ZBQWdGOzs7QUFFaEYsa0NBQWtDO0FBQ2xDLDhDQUErRTtBQUF0RSxxR0FBQSxRQUFRLE9BQUE7QUFDakIsa0RBQWdEO0FBQXZDLHlHQUFBLFVBQVUsT0FBQTtBQUNuQixvREFBa0Q7QUFBekMsMkdBQUEsV0FBVyxPQUFBO0FBRXBCLHlDQUF5QztBQUN6QywwQ0FBcUQ7QUFBNUMsNEZBQUEsSUFBSSxPQUFBO0FBRWIsb0NBQW9DO0FBQ3BDLG9EQXlCOEI7QUF0QjVCLG9IQUFBLHFCQUFxQixPQUFBO0FBY3JCLGdDQUFnQztBQUNoQyxrSEFBQSxtQkFBbUIsT0FBQTtBQUNuQiw4R0FBQSxlQUFlLE9BQUE7QUFDZixrSEFBQSxtQkFBbUIsT0FBQTtBQUNuQiwrR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQiwrR0FBQSxnQkFBZ0IsT0FBQTtBQUNoQixtQkFBbUI7QUFDbkIsMEdBQUEsV0FBVyxPQUFBO0FBR2IsNkJBQTZCO0FBQzdCLDBEQUFvRztBQUEzRiw2R0FBQSxZQUFZLE9BQUE7QUFBcUIsd0hBQUEsdUJBQXVCLE9BQUE7QUFFakUsVUFBVTtBQUNWLHFEQUF5RjtBQUFoRix5R0FBQSxVQUFVLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gU3RlcCBTREsgLSBQdWJsaWMgQVBJXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4vLyBCYXNlIGNsYXNzZXMgZm9yIGNyZWF0aW5nIHN0ZXBzXG5leHBvcnQgeyBCYXNlU3RlcCwgU3RlcENsYXNzLCBTdGVwTWV0YWRhdGEsIFN0ZXBLaW5kIH0gZnJvbSBcIi4vYmFzZS9iYXNlLXN0ZXBcIjtcbmV4cG9ydCB7IFNpbXBsZVN0ZXAgfSBmcm9tIFwiLi9iYXNlL3NpbXBsZS1zdGVwXCI7XG5leHBvcnQgeyBQb2xsaW5nU3RlcCB9IGZyb20gXCIuL2Jhc2UvcG9sbGluZy1zdGVwXCI7XG5cbi8vIERlY29yYXRvciBmb3IgYWRkaW5nIG1ldGFkYXRhIHRvIHN0ZXBzXG5leHBvcnQgeyBTdGVwLCBTdGVwQ29uZmlnIH0gZnJvbSBcIi4vZGVjb3JhdG9ycy9zdGVwXCI7XG5cbi8vIE91dHB1dCB0eXBlcyBhbmQgaGVscGVyIGZ1bmN0aW9uc1xuZXhwb3J0IHtcbiAgLy8gQXBwcm92YWwgY29udGV4dFxuICBBcHByb3ZhbENvbnRleHQsXG4gIEFwcHJvdmFsQ29udGV4dFNjaGVtYSxcbiAgLy8gUGhhc2Utc3BlY2lmaWMgb3V0cHV0c1xuICBQcmVwYXJlT3V0cHV0LFxuICBSdW5PdXRwdXQsXG4gIFRyaWdnZXJPdXRwdXQsXG4gIFRyaWdnZXJlZE91dHB1dCxcbiAgUG9sbE91dHB1dCxcbiAgUG9sbEFnYWluT3V0cHV0LFxuICAvLyBDb21tb24gb3V0cHV0c1xuICBTdWNjZXNzT3V0cHV0LFxuICBGYWlsZWRPdXRwdXQsXG4gIEFwcHJvdmFsUmVxdWlyZWRPdXRwdXQsXG4gIC8vIENvbWJpbmVkIG91dHB1dCB0eXBlXG4gIFN0ZXBPdXRwdXQsXG4gIC8vIE91dHB1dCBzY2hlbWFzIGZvciB2YWxpZGF0aW9uXG4gIFByZXBhcmVPdXRwdXRTY2hlbWEsXG4gIFJ1bk91dHB1dFNjaGVtYSxcbiAgVHJpZ2dlck91dHB1dFNjaGVtYSxcbiAgUG9sbE91dHB1dFNjaGVtYSxcbiAgU3RlcE91dHB1dFNjaGVtYSxcbiAgLy8gSGVscGVyIGZ1bmN0aW9uc1xuICBTdGVwT3V0cHV0cyxcbn0gZnJvbSBcIi4vb3V0cHV0L3N0ZXAtb3V0cHV0XCI7XG5cbi8vIFJlZ2lzdHJ5IGZvciBydW5uaW5nIHN0ZXBzXG5leHBvcnQgeyBTdGVwUmVnaXN0cnksIFN0ZXBSZWdpc3RyeUlucHV0LCBTdGVwUmVnaXN0cnlJbnB1dFNjaGVtYSB9IGZyb20gXCIuL3JlZ2lzdHJ5L3N0ZXAtcmVnaXN0cnlcIjtcblxuLy8gTG9nZ2luZ1xuZXhwb3J0IHsgU3RlcExvZ2dlciwgU3RlcExvZ2dlckNvbmZpZywgTG9nRW50cnksIExvZ0xldmVsIH0gZnJvbSBcIi4vbG9nZ2luZy9zdGVwLWxvZ2dlclwiO1xuIl19
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type LogLevel = "info" | "error";
|
|
2
|
+
export interface LogEntry {
|
|
3
|
+
timestamp: string;
|
|
4
|
+
level: LogLevel;
|
|
5
|
+
message: string;
|
|
6
|
+
data?: Record<string, unknown>;
|
|
7
|
+
stepType: string;
|
|
8
|
+
executionId: string;
|
|
9
|
+
}
|
|
10
|
+
export interface StepLoggerConfig {
|
|
11
|
+
logDir: string;
|
|
12
|
+
executionId: string;
|
|
13
|
+
stepType: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* File-based structured logger for steps.
|
|
17
|
+
* Writes JSON lines to {logDir}/{executionId}.jsonl
|
|
18
|
+
*/
|
|
19
|
+
export declare class StepLogger {
|
|
20
|
+
private readonly logFilePath;
|
|
21
|
+
private readonly stepType;
|
|
22
|
+
private readonly executionId;
|
|
23
|
+
constructor(config: StepLoggerConfig);
|
|
24
|
+
info(message: string, data?: Record<string, unknown>): void;
|
|
25
|
+
error(message: string, data?: Record<string, unknown>): void;
|
|
26
|
+
private write;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* No-op logger for use when logging is not configured.
|
|
30
|
+
*/
|
|
31
|
+
export declare class NoOpLogger extends StepLogger {
|
|
32
|
+
constructor();
|
|
33
|
+
info(_message: string, _data?: Record<string, unknown>): void;
|
|
34
|
+
error(_message: string, _data?: Record<string, unknown>): void;
|
|
35
|
+
}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.NoOpLogger = exports.StepLogger = void 0;
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
/**
|
|
40
|
+
* File-based structured logger for steps.
|
|
41
|
+
* Writes JSON lines to {logDir}/{executionId}.jsonl
|
|
42
|
+
*/
|
|
43
|
+
class StepLogger {
|
|
44
|
+
logFilePath;
|
|
45
|
+
stepType;
|
|
46
|
+
executionId;
|
|
47
|
+
constructor(config) {
|
|
48
|
+
this.stepType = config.stepType;
|
|
49
|
+
this.executionId = config.executionId;
|
|
50
|
+
this.logFilePath = path.join(config.logDir, `${config.executionId}.jsonl`);
|
|
51
|
+
// Ensure log directory exists
|
|
52
|
+
const logDir = path.dirname(this.logFilePath);
|
|
53
|
+
if (!fs.existsSync(logDir)) {
|
|
54
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
info(message, data) {
|
|
58
|
+
this.write("info", message, data);
|
|
59
|
+
}
|
|
60
|
+
error(message, data) {
|
|
61
|
+
this.write("error", message, data);
|
|
62
|
+
}
|
|
63
|
+
write(level, message, data) {
|
|
64
|
+
const entry = {
|
|
65
|
+
timestamp: new Date().toISOString(),
|
|
66
|
+
level,
|
|
67
|
+
message,
|
|
68
|
+
stepType: this.stepType,
|
|
69
|
+
executionId: this.executionId,
|
|
70
|
+
};
|
|
71
|
+
if (data !== undefined) {
|
|
72
|
+
entry.data = data;
|
|
73
|
+
}
|
|
74
|
+
fs.appendFileSync(this.logFilePath, JSON.stringify(entry) + "\n");
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
exports.StepLogger = StepLogger;
|
|
78
|
+
/**
|
|
79
|
+
* No-op logger for use when logging is not configured.
|
|
80
|
+
*/
|
|
81
|
+
class NoOpLogger extends StepLogger {
|
|
82
|
+
constructor() {
|
|
83
|
+
// Pass dummy config - methods are overridden anyway
|
|
84
|
+
super({ logDir: "/tmp", executionId: "noop", stepType: "noop" });
|
|
85
|
+
}
|
|
86
|
+
info(_message, _data) {
|
|
87
|
+
// No-op
|
|
88
|
+
}
|
|
89
|
+
error(_message, _data) {
|
|
90
|
+
// No-op
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
exports.NoOpLogger = NoOpLogger;
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC1sb2dnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9nZ2luZy9zdGVwLWxvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBbUI3Qjs7O0dBR0c7QUFDSCxNQUFhLFVBQVU7SUFDSixXQUFXLENBQVM7SUFDcEIsUUFBUSxDQUFTO0lBQ2pCLFdBQVcsQ0FBUztJQUVyQyxZQUFZLE1BQXdCO1FBQ2xDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQztRQUNoQyxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxRQUFRLENBQUMsQ0FBQztRQUUzRSw4QkFBOEI7UUFDOUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUMzQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQWUsRUFBRSxJQUE4QjtRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFlLEVBQUUsSUFBOEI7UUFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTyxLQUFLLENBQ1gsS0FBZSxFQUNmLE9BQWUsRUFDZixJQUE4QjtRQUU5QixNQUFNLEtBQUssR0FBYTtZQUN0QixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUU7WUFDbkMsS0FBSztZQUNMLE9BQU87WUFDUCxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQzlCLENBQUM7UUFFRixJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QixLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNwQixDQUFDO1FBRUQsRUFBRSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDcEUsQ0FBQztDQUNGO0FBNUNELGdDQTRDQztBQUVEOztHQUVHO0FBQ0gsTUFBYSxVQUFXLFNBQVEsVUFBVTtJQUN4QztRQUNFLG9EQUFvRDtRQUNwRCxLQUFLLENBQUMsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVRLElBQUksQ0FBQyxRQUFnQixFQUFFLEtBQStCO1FBQzdELFFBQVE7SUFDVixDQUFDO0lBRVEsS0FBSyxDQUFDLFFBQWdCLEVBQUUsS0FBK0I7UUFDOUQsUUFBUTtJQUNWLENBQUM7Q0FDRjtBQWJELGdDQWFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCI7XG5cbmV4cG9ydCB0eXBlIExvZ0xldmVsID0gXCJpbmZvXCIgfCBcImVycm9yXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9nRW50cnkge1xuICB0aW1lc3RhbXA6IHN0cmluZztcbiAgbGV2ZWw6IExvZ0xldmVsO1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgc3RlcFR5cGU6IHN0cmluZztcbiAgZXhlY3V0aW9uSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdGVwTG9nZ2VyQ29uZmlnIHtcbiAgbG9nRGlyOiBzdHJpbmc7XG4gIGV4ZWN1dGlvbklkOiBzdHJpbmc7XG4gIHN0ZXBUeXBlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsZS1iYXNlZCBzdHJ1Y3R1cmVkIGxvZ2dlciBmb3Igc3RlcHMuXG4gKiBXcml0ZXMgSlNPTiBsaW5lcyB0byB7bG9nRGlyfS97ZXhlY3V0aW9uSWR9Lmpzb25sXG4gKi9cbmV4cG9ydCBjbGFzcyBTdGVwTG9nZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2dGaWxlUGF0aDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHN0ZXBUeXBlOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXhlY3V0aW9uSWQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFN0ZXBMb2dnZXJDb25maWcpIHtcbiAgICB0aGlzLnN0ZXBUeXBlID0gY29uZmlnLnN0ZXBUeXBlO1xuICAgIHRoaXMuZXhlY3V0aW9uSWQgPSBjb25maWcuZXhlY3V0aW9uSWQ7XG4gICAgdGhpcy5sb2dGaWxlUGF0aCA9IHBhdGguam9pbihjb25maWcubG9nRGlyLCBgJHtjb25maWcuZXhlY3V0aW9uSWR9Lmpzb25sYCk7XG5cbiAgICAvLyBFbnN1cmUgbG9nIGRpcmVjdG9yeSBleGlzdHNcbiAgICBjb25zdCBsb2dEaXIgPSBwYXRoLmRpcm5hbWUodGhpcy5sb2dGaWxlUGF0aCk7XG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKGxvZ0RpcikpIHtcbiAgICAgIGZzLm1rZGlyU3luYyhsb2dEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxuXG4gIGluZm8obWVzc2FnZTogc3RyaW5nLCBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcbiAgICB0aGlzLndyaXRlKFwiaW5mb1wiLCBtZXNzYWdlLCBkYXRhKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgdGhpcy53cml0ZShcImVycm9yXCIsIG1lc3NhZ2UsIGRhdGEpO1xuICB9XG5cbiAgcHJpdmF0ZSB3cml0ZShcbiAgICBsZXZlbDogTG9nTGV2ZWwsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGRhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPlxuICApOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeTogTG9nRW50cnkgPSB7XG4gICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgIGxldmVsLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHN0ZXBUeXBlOiB0aGlzLnN0ZXBUeXBlLFxuICAgICAgZXhlY3V0aW9uSWQ6IHRoaXMuZXhlY3V0aW9uSWQsXG4gICAgfTtcblxuICAgIGlmIChkYXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudHJ5LmRhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIGZzLmFwcGVuZEZpbGVTeW5jKHRoaXMubG9nRmlsZVBhdGgsIEpTT04uc3RyaW5naWZ5KGVudHJ5KSArIFwiXFxuXCIpO1xuICB9XG59XG5cbi8qKlxuICogTm8tb3AgbG9nZ2VyIGZvciB1c2Ugd2hlbiBsb2dnaW5nIGlzIG5vdCBjb25maWd1cmVkLlxuICovXG5leHBvcnQgY2xhc3MgTm9PcExvZ2dlciBleHRlbmRzIFN0ZXBMb2dnZXIge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyBQYXNzIGR1bW15IGNvbmZpZyAtIG1ldGhvZHMgYXJlIG92ZXJyaWRkZW4gYW55d2F5XG4gICAgc3VwZXIoeyBsb2dEaXI6IFwiL3RtcFwiLCBleGVjdXRpb25JZDogXCJub29wXCIsIHN0ZXBUeXBlOiBcIm5vb3BcIiB9KTtcbiAgfVxuXG4gIG92ZXJyaWRlIGluZm8oX21lc3NhZ2U6IHN0cmluZywgX2RhdGE/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHZvaWQge1xuICAgIC8vIE5vLW9wXG4gIH1cblxuICBvdmVycmlkZSBlcnJvcihfbWVzc2FnZTogc3RyaW5nLCBfZGF0YT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdm9pZCB7XG4gICAgLy8gTm8tb3BcbiAgfVxufVxuIl19
|