larkci 0.1.0 → 0.1.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/README.md +36 -0
- package/dist/api/client.d.ts +10 -0
- package/dist/api/client.d.ts.map +1 -1
- package/dist/api/client.js +26 -0
- package/dist/api/client.js.map +1 -1
- package/dist/commands/execution.d.ts.map +1 -1
- package/dist/commands/execution.js +24 -0
- package/dist/commands/execution.js.map +1 -1
- package/dist/commands/invoke.d.ts.map +1 -1
- package/dist/commands/invoke.js +55 -4
- package/dist/commands/invoke.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -50,6 +50,13 @@ Start a new execution for a workflow:
|
|
|
50
50
|
larkci workflows invoke <workflow_id>
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
+
| Flag | Description |
|
|
54
|
+
|---|---|
|
|
55
|
+
| `--wait` | Wait for the execution to reach a terminal status before exiting |
|
|
56
|
+
| `--timeout <seconds>` | Maximum time to wait in seconds (default: 600, requires `--wait`) |
|
|
57
|
+
|
|
58
|
+
When `--wait` is used, progress updates are printed to stderr and the final execution JSON is printed to stdout. Exit codes: `0` = success, `1` = workflow failure, `2` = timeout, `3` = unexpected error.
|
|
59
|
+
|
|
53
60
|
#### Get a workflow execution
|
|
54
61
|
|
|
55
62
|
Retrieve details of a specific execution:
|
|
@@ -58,19 +65,48 @@ Retrieve details of a specific execution:
|
|
|
58
65
|
larkci workflows executions get <workflow_id> <execution_id>
|
|
59
66
|
```
|
|
60
67
|
|
|
68
|
+
#### Get execution logs
|
|
69
|
+
|
|
70
|
+
Retrieve logs for a specific execution:
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
larkci workflows executions logs <workflow_id> <execution_id>
|
|
74
|
+
```
|
|
75
|
+
|
|
61
76
|
### Examples
|
|
62
77
|
|
|
63
78
|
```bash
|
|
64
79
|
# Invoke a workflow
|
|
65
80
|
larkci workflows invoke wf_abc123
|
|
66
81
|
|
|
82
|
+
# Invoke and wait for completion (10 min default timeout)
|
|
83
|
+
larkci workflows invoke wf_abc123 --wait
|
|
84
|
+
|
|
85
|
+
# Invoke and wait with a custom timeout of 5 minutes
|
|
86
|
+
larkci workflows invoke wf_abc123 --wait --timeout 300
|
|
87
|
+
|
|
67
88
|
# Check execution status
|
|
68
89
|
larkci workflows executions get wf_abc123 exec_xyz789
|
|
69
90
|
|
|
91
|
+
# Fetch execution logs
|
|
92
|
+
larkci workflows executions logs wf_abc123 exec_xyz789
|
|
93
|
+
|
|
70
94
|
# Override API key inline
|
|
71
95
|
larkci --api-key sk-test-key workflows invoke wf_abc123
|
|
72
96
|
```
|
|
73
97
|
|
|
98
|
+
### CI Pipeline Usage
|
|
99
|
+
|
|
100
|
+
The `--wait` flag makes it easy to use in CI pipelines. The command will block until the workflow completes and exit with a non-zero code on failure:
|
|
101
|
+
|
|
102
|
+
```yaml
|
|
103
|
+
# GitHub Actions example
|
|
104
|
+
- name: Run LarkCI workflow
|
|
105
|
+
run: larkci workflows invoke ${{ vars.WORKFLOW_ID }} --wait --timeout 300
|
|
106
|
+
env:
|
|
107
|
+
LARKCI_API_KEY: ${{ secrets.LARKCI_API_KEY }}
|
|
108
|
+
```
|
|
109
|
+
|
|
74
110
|
## Contributing
|
|
75
111
|
|
|
76
112
|
See [CONTRIBUTING.md](CONTRIBUTING.md) for development setup and guidelines.
|
package/dist/api/client.d.ts
CHANGED
|
@@ -1,5 +1,13 @@
|
|
|
1
1
|
import type { Config } from "../config.js";
|
|
2
2
|
import type { WorkflowExecutionResource } from "./types.js";
|
|
3
|
+
export declare class TimeoutError extends Error {
|
|
4
|
+
constructor(message: string);
|
|
5
|
+
}
|
|
6
|
+
export interface PollOptions {
|
|
7
|
+
timeoutMs: number;
|
|
8
|
+
pollIntervalMs: number;
|
|
9
|
+
onPoll?: (execution: WorkflowExecutionResource, elapsedMs: number) => void | Promise<void>;
|
|
10
|
+
}
|
|
3
11
|
export declare class LarkCIClient {
|
|
4
12
|
private baseUrl;
|
|
5
13
|
private apiKey;
|
|
@@ -7,5 +15,7 @@ export declare class LarkCIClient {
|
|
|
7
15
|
private request;
|
|
8
16
|
invokeWorkflow(workflowId: string): Promise<WorkflowExecutionResource>;
|
|
9
17
|
getWorkflowExecution(workflowId: string, executionId: string): Promise<WorkflowExecutionResource>;
|
|
18
|
+
getWorkflowExecutionLogs(workflowId: string, executionId: string): Promise<string[]>;
|
|
19
|
+
pollWorkflowExecution(workflowId: string, executionId: string, options: PollOptions): Promise<WorkflowExecutionResource>;
|
|
10
20
|
}
|
|
11
21
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/api/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;YAKZ,OAAO;IAoCf,cAAc,CAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,yBAAyB,CAAC;IAO/B,oBAAoB,CACxB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAE5D,qBAAa,YAAa,SAAQ,KAAK;gBACzB,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,yBAAyB,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5F;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;YAKZ,OAAO;IAoCf,cAAc,CAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,yBAAyB,CAAC;IAO/B,oBAAoB,CACxB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,yBAAyB,CAAC;IAO/B,wBAAwB,CAC5B,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,EAAE,CAAC;IAOd,qBAAqB,CACzB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,yBAAyB,CAAC;CA6BtC"}
|
package/dist/api/client.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
export class TimeoutError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = "TimeoutError";
|
|
5
|
+
}
|
|
6
|
+
}
|
|
1
7
|
export class LarkCIClient {
|
|
2
8
|
baseUrl;
|
|
3
9
|
apiKey;
|
|
@@ -42,5 +48,25 @@ export class LarkCIClient {
|
|
|
42
48
|
async getWorkflowExecution(workflowId, executionId) {
|
|
43
49
|
return this.request("GET", `/workflows/${workflowId}/executions/${executionId}`);
|
|
44
50
|
}
|
|
51
|
+
async getWorkflowExecutionLogs(workflowId, executionId) {
|
|
52
|
+
return this.request("GET", `/workflows/${workflowId}/executions/${executionId}/logs`);
|
|
53
|
+
}
|
|
54
|
+
async pollWorkflowExecution(workflowId, executionId, options) {
|
|
55
|
+
const { timeoutMs, pollIntervalMs, onPoll } = options;
|
|
56
|
+
const startTime = Date.now();
|
|
57
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
58
|
+
while (true) {
|
|
59
|
+
const execution = await this.getWorkflowExecution(workflowId, executionId);
|
|
60
|
+
const elapsedMs = Date.now() - startTime;
|
|
61
|
+
await onPoll?.(execution, elapsedMs);
|
|
62
|
+
if (execution.status === "success" || execution.status === "failure") {
|
|
63
|
+
return execution;
|
|
64
|
+
}
|
|
65
|
+
if (elapsedMs >= timeoutMs) {
|
|
66
|
+
throw new TimeoutError(`Timed out after ${Math.round(timeoutMs / 1000)}s waiting for execution ${executionId} to complete (last status: ${execution.status})`);
|
|
67
|
+
}
|
|
68
|
+
await sleep(pollIntervalMs);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
45
71
|
}
|
|
46
72
|
//# sourceMappingURL=client.js.map
|
package/dist/api/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,YAAY;IACf,OAAO,CAAS;IAChB,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,IAAY;QACnD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QAErC,IAAI,QAAkB,CAAC;QACvB,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAC1B,MAAM;gBACN,OAAO,EAAE;oBACP,WAAW,EAAE,IAAI,CAAC,MAAM;oBACxB,cAAc,EAAE,kBAAkB;iBACnC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,KAAK,GACT,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,CAAC,OAAO,KAAK,KAAK,2DAA2D,CAC1G,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,OAAO,GAAG,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YAC/D,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAA4B,CAAC;gBAChE,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;oBACpC,OAAO,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzC,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sDAAsD;YACxD,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,CAAC;QAED,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,UAAkB;QAElB,OAAO,IAAI,CAAC,OAAO,CACjB,MAAM,EACN,cAAc,UAAU,SAAS,CAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,UAAkB,EAClB,WAAmB;QAEnB,OAAO,IAAI,CAAC,OAAO,CACjB,KAAK,EACL,cAAc,UAAU,eAAe,WAAW,EAAE,CACrD,CAAC;IACJ,CAAC;CACF"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/commands/execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,OAAO,GACf,IAAI,
|
|
1
|
+
{"version":3,"file":"execution.d.ts","sourceRoot":"","sources":["../../src/commands/execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,wBAAwB,CACtC,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,OAAO,GACf,IAAI,CA4DN"}
|
|
@@ -26,5 +26,29 @@ export function registerExecutionCommand(workflows, program) {
|
|
|
26
26
|
process.exit(1);
|
|
27
27
|
}
|
|
28
28
|
});
|
|
29
|
+
executions
|
|
30
|
+
.command("logs")
|
|
31
|
+
.description("Get logs for a specific workflow execution")
|
|
32
|
+
.argument("<workflow_id>", "The ID of the workflow")
|
|
33
|
+
.argument("<execution_id>", "The ID of the execution")
|
|
34
|
+
.action(async (workflowId, executionId) => {
|
|
35
|
+
const opts = program.opts();
|
|
36
|
+
const config = getConfig({
|
|
37
|
+
apiKey: opts.apiKey,
|
|
38
|
+
apiUrl: opts.apiUrl,
|
|
39
|
+
});
|
|
40
|
+
const client = new LarkCIClient(config);
|
|
41
|
+
try {
|
|
42
|
+
const logs = await client.getWorkflowExecutionLogs(workflowId, executionId);
|
|
43
|
+
for (const line of logs) {
|
|
44
|
+
console.log(line);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
49
|
+
console.error(`Error: ${message}`);
|
|
50
|
+
process.exit(1);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
29
53
|
}
|
|
30
54
|
//# sourceMappingURL=execution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/commands/execution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,wBAAwB,CACtC,SAAkB,EAClB,OAAgB;IAEhB,MAAM,UAAU,GAAG,SAAS;SACzB,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE7C,UAAU;SACP,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,8CAA8C,CAAC;SAC3D,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;SACnD,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,WAAmB,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAC9C,UAAU,EACV,WAAW,CACZ,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
1
|
+
{"version":3,"file":"execution.js","sourceRoot":"","sources":["../../src/commands/execution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,UAAU,wBAAwB,CACtC,SAAkB,EAClB,OAAgB;IAEhB,MAAM,UAAU,GAAG,SAAS;SACzB,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,4BAA4B,CAAC,CAAC;IAE7C,UAAU;SACP,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,8CAA8C,CAAC;SAC3D,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;SACnD,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,WAAmB,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAC9C,UAAU,EACV,WAAW,CACZ,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,UAAU;SACP,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,4CAA4C,CAAC;SACzD,QAAQ,CAAC,eAAe,EAAE,wBAAwB,CAAC;SACnD,QAAQ,CAAC,gBAAgB,EAAE,yBAAyB,CAAC;SACrD,MAAM,CAAC,KAAK,EAAE,UAAkB,EAAE,WAAmB,EAAE,EAAE;QACxD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,SAAS,CAAC;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAChD,UAAU,EACV,WAAW,CACZ,CAAC;YACF,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GACX,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC;YACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"invoke.d.ts","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,OAAO,EAClB,OAAO,EAAE,OAAO,GACf,IAAI,CA+EN"}
|
package/dist/commands/invoke.js
CHANGED
|
@@ -1,11 +1,23 @@
|
|
|
1
|
-
import { LarkCIClient } from "../api/client.js";
|
|
1
|
+
import { LarkCIClient, TimeoutError } from "../api/client.js";
|
|
2
2
|
import { getConfig } from "../config.js";
|
|
3
|
+
const DEFAULT_TIMEOUT_SECONDS = 600;
|
|
4
|
+
const POLL_INTERVAL_MS = 5_000;
|
|
5
|
+
function formatElapsed(ms) {
|
|
6
|
+
const totalSeconds = Math.round(ms / 1000);
|
|
7
|
+
if (totalSeconds < 60)
|
|
8
|
+
return `${totalSeconds}s`;
|
|
9
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
10
|
+
const seconds = totalSeconds % 60;
|
|
11
|
+
return `${minutes}m${seconds}s`;
|
|
12
|
+
}
|
|
3
13
|
export function registerInvokeCommand(workflows, program) {
|
|
4
14
|
workflows
|
|
5
15
|
.command("invoke")
|
|
6
16
|
.description("Invoke a workflow and start a new execution")
|
|
7
17
|
.argument("<workflow_id>", "The ID of the workflow to invoke")
|
|
8
|
-
.
|
|
18
|
+
.option("--wait", "Wait for the execution to reach a terminal status before exiting")
|
|
19
|
+
.option("--timeout <seconds>", "Maximum time to wait in seconds (default: 600, requires --wait)")
|
|
20
|
+
.action(async (workflowId, cmdOpts) => {
|
|
9
21
|
const opts = program.opts();
|
|
10
22
|
const config = getConfig({
|
|
11
23
|
apiKey: opts.apiKey,
|
|
@@ -14,12 +26,51 @@ export function registerInvokeCommand(workflows, program) {
|
|
|
14
26
|
const client = new LarkCIClient(config);
|
|
15
27
|
try {
|
|
16
28
|
const execution = await client.invokeWorkflow(workflowId);
|
|
17
|
-
|
|
29
|
+
if (!cmdOpts.wait) {
|
|
30
|
+
console.log(JSON.stringify(execution, null, 2));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
const timeoutSeconds = cmdOpts.timeout
|
|
34
|
+
? parseInt(cmdOpts.timeout, 10)
|
|
35
|
+
: DEFAULT_TIMEOUT_SECONDS;
|
|
36
|
+
if (isNaN(timeoutSeconds) || timeoutSeconds <= 0) {
|
|
37
|
+
console.error("Error: --timeout must be a positive number of seconds");
|
|
38
|
+
process.exit(3);
|
|
39
|
+
}
|
|
40
|
+
console.error(`Waiting for execution ${execution.id} (timeout: ${timeoutSeconds}s)...`);
|
|
41
|
+
let logOffset = 0;
|
|
42
|
+
const finalExecution = await client.pollWorkflowExecution(workflowId, execution.id, {
|
|
43
|
+
timeoutMs: timeoutSeconds * 1000,
|
|
44
|
+
pollIntervalMs: POLL_INTERVAL_MS,
|
|
45
|
+
onPoll: async (exec, elapsedMs) => {
|
|
46
|
+
console.error(` Status: ${exec.status} (${formatElapsed(elapsedMs)} elapsed)`);
|
|
47
|
+
try {
|
|
48
|
+
const logs = await client.getWorkflowExecutionLogs(workflowId, execution.id);
|
|
49
|
+
if (logs.length > logOffset) {
|
|
50
|
+
for (const line of logs.slice(logOffset)) {
|
|
51
|
+
console.error(` Log: ${line}`);
|
|
52
|
+
}
|
|
53
|
+
logOffset = logs.length;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// Logs may not be available yet (e.g. execution is still pending)
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
console.log(JSON.stringify(finalExecution, null, 2));
|
|
62
|
+
if (finalExecution.status === "failure") {
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
18
65
|
}
|
|
19
66
|
catch (error) {
|
|
67
|
+
if (error instanceof TimeoutError) {
|
|
68
|
+
console.error(`Error: ${error.message}`);
|
|
69
|
+
process.exit(2);
|
|
70
|
+
}
|
|
20
71
|
const message = error instanceof Error ? error.message : String(error);
|
|
21
72
|
console.error(`Error: ${message}`);
|
|
22
|
-
process.exit(
|
|
73
|
+
process.exit(3);
|
|
23
74
|
}
|
|
24
75
|
});
|
|
25
76
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"invoke.js","sourceRoot":"","sources":["../../src/commands/invoke.ts"],"names":[],"mappings":"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"}
|