@things-factory/integration-base 9.0.6 → 9.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/dist-server/engine/connector/index.d.ts +1 -0
  2. package/dist-server/engine/connector/index.js +1 -0
  3. package/dist-server/engine/connector/index.js.map +1 -1
  4. package/dist-server/engine/connector/pyrun-connector.d.ts +16 -0
  5. package/dist-server/engine/connector/pyrun-connector.js +56 -0
  6. package/dist-server/engine/connector/pyrun-connector.js.map +1 -0
  7. package/dist-server/engine/task/index.d.ts +1 -0
  8. package/dist-server/engine/task/index.js +1 -0
  9. package/dist-server/engine/task/index.js.map +1 -1
  10. package/dist-server/engine/task/pyrun-execute.d.ts +1 -0
  11. package/dist-server/engine/task/pyrun-execute.js +43 -0
  12. package/dist-server/engine/task/pyrun-execute.js.map +1 -0
  13. package/dist-server/tsconfig.tsbuildinfo +1 -1
  14. package/helps/integration/connector/pyrun-connector.ja.md +55 -0
  15. package/helps/integration/connector/pyrun-connector.ko.md +55 -0
  16. package/helps/integration/connector/pyrun-connector.md +55 -0
  17. package/helps/integration/connector/pyrun-connector.ms.md +55 -0
  18. package/helps/integration/connector/pyrun-connector.zh.md +55 -0
  19. package/helps/integration/task/pyrun-execute.ja.md +36 -0
  20. package/helps/integration/task/pyrun-execute.ko.md +36 -0
  21. package/helps/integration/task/pyrun-execute.md +36 -0
  22. package/helps/integration/task/pyrun-execute.ms.md +36 -0
  23. package/helps/integration/task/pyrun-execute.zh.md +36 -0
  24. package/package.json +2 -2
  25. package/translations/en.json +1 -0
  26. package/translations/ja.json +1 -0
  27. package/translations/ko.json +1 -0
  28. package/translations/ms.json +1 -0
  29. package/translations/zh.json +1 -0
@@ -11,3 +11,4 @@ import './mysql-connector';
11
11
  import './socket-server';
12
12
  import './operato-connector';
13
13
  import './headless-connector';
14
+ import './pyrun-connector';
@@ -13,4 +13,5 @@ require("./mysql-connector");
13
13
  require("./socket-server");
14
14
  require("./operato-connector");
15
15
  require("./headless-connector");
16
+ require("./pyrun-connector");
16
17
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/connector/index.ts"],"names":[],"mappings":";;AAAA,8BAA2B;AAC3B,iCAA8B;AAC9B,4BAAyB;AACzB,+BAA4B;AAC5B,8BAA2B;AAC3B,kCAA+B;AAC/B,4BAAyB;AACzB,6BAA0B;AAC1B,8BAA2B;AAC3B,6BAA0B;AAC1B,2BAAwB;AACxB,+BAA4B;AAC5B,gCAA6B","sourcesContent":["import './echo-back-server'\nimport './echo-back-connector'\nimport './http-connector'\nimport './graphql-connector'\nimport './sqlite-connector'\nimport './postgresql-connector'\nimport './mqtt-connector'\nimport './mssql-connector'\nimport './oracle-connector'\nimport './mysql-connector'\nimport './socket-server'\nimport './operato-connector'\nimport './headless-connector'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/connector/index.ts"],"names":[],"mappings":";;AAAA,8BAA2B;AAC3B,iCAA8B;AAC9B,4BAAyB;AACzB,+BAA4B;AAC5B,8BAA2B;AAC3B,kCAA+B;AAC/B,4BAAyB;AACzB,6BAA0B;AAC1B,8BAA2B;AAC3B,6BAA0B;AAC1B,2BAAwB;AACxB,+BAA4B;AAC5B,gCAA6B;AAC7B,6BAA0B","sourcesContent":["import './echo-back-server'\nimport './echo-back-connector'\nimport './http-connector'\nimport './graphql-connector'\nimport './sqlite-connector'\nimport './postgresql-connector'\nimport './mqtt-connector'\nimport './mssql-connector'\nimport './oracle-connector'\nimport './mysql-connector'\nimport './socket-server'\nimport './operato-connector'\nimport './headless-connector'\nimport './pyrun-connector'\n"]}
@@ -0,0 +1,16 @@
1
+ import { Connector } from '../types';
2
+ import { InputConnection } from '../../service/connection/connection-type';
3
+ export declare class PyrunConnector implements Connector {
4
+ ready(connectionConfigs: InputConnection[]): Promise<void>;
5
+ connect(connection: InputConnection): Promise<void>;
6
+ disconnect(connection: InputConnection): Promise<void>;
7
+ get parameterSpec(): {
8
+ type: string;
9
+ name: string;
10
+ label: string;
11
+ required: boolean;
12
+ }[];
13
+ get taskPrefixes(): string[];
14
+ get description(): string;
15
+ get help(): string;
16
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PyrunConnector = void 0;
4
+ const connection_manager_1 = require("../connection-manager");
5
+ class PyrunConnector {
6
+ async ready(connectionConfigs) {
7
+ await Promise.all(connectionConfigs.map(this.connect.bind(this)));
8
+ connection_manager_1.ConnectionManager.logger.info('pyrun-connector connections are ready');
9
+ }
10
+ async connect(connection) {
11
+ var { username, password, token } = connection.params;
12
+ if (!token && username && password) {
13
+ // /auth/login 엔드포인트로 로그인하여 토큰 발급 시도
14
+ const loginUrl = `${connection.endpoint}/auth/login`;
15
+ const res = await fetch(loginUrl, {
16
+ method: 'POST',
17
+ headers: { 'Content-Type': 'application/json' },
18
+ body: JSON.stringify({ username, password })
19
+ });
20
+ if (!res.ok) {
21
+ const error = await res.text();
22
+ throw new Error(`pyrun-connector 인증 실패: ${res.status} ${error}`);
23
+ }
24
+ var data = await res.json();
25
+ token = data.access_token;
26
+ }
27
+ connection_manager_1.ConnectionManager.addConnectionInstance(connection, {
28
+ ...connection,
29
+ token
30
+ });
31
+ connection_manager_1.ConnectionManager.logger.info(`pyrun-connector connection(${connection.name}:${connection.endpoint}) is connected`);
32
+ }
33
+ async disconnect(connection) {
34
+ connection_manager_1.ConnectionManager.removeConnectionInstance(connection);
35
+ connection_manager_1.ConnectionManager.logger.info(`pyrun-connector connection(${connection.name}) is disconnected`);
36
+ }
37
+ get parameterSpec() {
38
+ return [
39
+ { type: 'string', name: 'username', label: 'username', required: false },
40
+ { type: 'password', name: 'password', label: 'password', required: false },
41
+ { type: 'string', name: 'token', label: 'token', required: false }
42
+ ];
43
+ }
44
+ get taskPrefixes() {
45
+ return ['pyrun'];
46
+ }
47
+ get description() {
48
+ return 'Python Runner(pyrun) REST API Connector';
49
+ }
50
+ get help() {
51
+ return 'integration/connector/pyrun-connector';
52
+ }
53
+ }
54
+ exports.PyrunConnector = PyrunConnector;
55
+ connection_manager_1.ConnectionManager.registerConnector('pyrun-connector', new PyrunConnector());
56
+ //# sourceMappingURL=pyrun-connector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyrun-connector.js","sourceRoot":"","sources":["../../../server/engine/connector/pyrun-connector.ts"],"names":[],"mappings":";;;AACA,8DAAyD;AAGzD,MAAa,cAAc;IACzB,KAAK,CAAC,KAAK,CAAC,iBAAoC;QAC9C,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjE,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;IACxE,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,UAA2B;QACvC,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,UAAU,CAAC,MAAM,CAAA;QAErD,IAAI,CAAC,KAAK,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACnC,oCAAoC;YACpC,MAAM,QAAQ,GAAG,GAAG,UAAU,CAAC,QAAQ,aAAa,CAAA;YACpD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE;gBAChC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC;aAC7C,CAAC,CAAA;YACF,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;gBAC9B,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAA;YAClE,CAAC;YAED,IAAI,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAA;YAC3B,KAAK,GAAG,IAAI,CAAC,YAAY,CAAA;QAC3B,CAAC;QAED,sCAAiB,CAAC,qBAAqB,CAAC,UAAU,EAAE;YAClD,GAAG,UAAU;YACb,KAAK;SACN,CAAC,CAAA;QACF,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,QAAQ,gBAAgB,CAAC,CAAA;IACrH,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAA2B;QAC1C,sCAAiB,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAA;QACtD,sCAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,8BAA8B,UAAU,CAAC,IAAI,mBAAmB,CAAC,CAAA;IACjG,CAAC;IAED,IAAI,aAAa;QACf,OAAO;YACL,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;YACxE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE;YAC1E,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;SACnE,CAAA;IACH,CAAC;IAED,IAAI,YAAY;QACd,OAAO,CAAC,OAAO,CAAC,CAAA;IAClB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,yCAAyC,CAAA;IAClD,CAAC;IAED,IAAI,IAAI;QACN,OAAO,uCAAuC,CAAA;IAChD,CAAC;CACF;AAzDD,wCAyDC;AAED,sCAAiB,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,IAAI,cAAc,EAAE,CAAC,CAAA","sourcesContent":["import { Connector } from '../types'\nimport { ConnectionManager } from '../connection-manager'\nimport { InputConnection } from '../../service/connection/connection-type'\n\nexport class PyrunConnector implements Connector {\n async ready(connectionConfigs: InputConnection[]) {\n await Promise.all(connectionConfigs.map(this.connect.bind(this)))\n ConnectionManager.logger.info('pyrun-connector connections are ready')\n }\n\n async connect(connection: InputConnection) {\n var { username, password, token } = connection.params\n\n if (!token && username && password) {\n // /auth/login 엔드포인트로 로그인하여 토큰 발급 시도\n const loginUrl = `${connection.endpoint}/auth/login`\n const res = await fetch(loginUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ username, password })\n })\n if (!res.ok) {\n const error = await res.text()\n throw new Error(`pyrun-connector 인증 실패: ${res.status} ${error}`)\n }\n\n var data = await res.json()\n token = data.access_token\n }\n\n ConnectionManager.addConnectionInstance(connection, {\n ...connection,\n token\n })\n ConnectionManager.logger.info(`pyrun-connector connection(${connection.name}:${connection.endpoint}) is connected`)\n }\n\n async disconnect(connection: InputConnection) {\n ConnectionManager.removeConnectionInstance(connection)\n ConnectionManager.logger.info(`pyrun-connector connection(${connection.name}) is disconnected`)\n }\n\n get parameterSpec() {\n return [\n { type: 'string', name: 'username', label: 'username', required: false },\n { type: 'password', name: 'password', label: 'password', required: false },\n { type: 'string', name: 'token', label: 'token', required: false }\n ]\n }\n\n get taskPrefixes() {\n return ['pyrun']\n }\n\n get description() {\n return 'Python Runner(pyrun) REST API Connector'\n }\n\n get help() {\n return 'integration/connector/pyrun-connector'\n }\n}\n\nConnectionManager.registerConnector('pyrun-connector', new PyrunConnector())\n"]}
@@ -43,3 +43,4 @@ import './jsonata';
43
43
  import './state-read';
44
44
  import './state-write';
45
45
  import './state-group-read';
46
+ import './pyrun-execute';
@@ -45,4 +45,5 @@ require("./jsonata");
45
45
  require("./state-read");
46
46
  require("./state-write");
47
47
  require("./state-group-read");
48
+ require("./pyrun-execute");
48
49
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA,uBAAoB;AACpB,0BAAuB;AACvB,mBAAgB;AAChB,iBAAc;AACd,qBAAkB;AAClB,sBAAmB;AACnB,uBAAoB;AACpB,2BAAwB;AACxB,4BAAyB;AACzB,iCAA8B;AAC9B,kCAA+B;AAC/B,0BAAuB;AACvB,2BAAwB;AACxB,8BAA2B;AAC3B,mCAAgC;AAChC,iCAA8B;AAC9B,yBAAsB;AACtB,kBAAe;AACf,iBAAc;AACd,yBAAsB;AACtB,+BAA4B;AAC5B,6BAA0B;AAC1B,mCAAgC;AAChC,wBAAqB;AACrB,8BAA2B;AAC3B,oBAAiB;AACjB,4BAAyB;AACzB,4BAAyB;AACzB,0BAAuB;AACvB,mBAAgB;AAChB,uBAAoB;AACpB,4BAAyB;AACzB,6BAA0B;AAC1B,oBAAiB;AACjB,0BAAuB;AACvB,yBAAsB;AACtB,2BAAwB;AACxB,4BAAyB;AACzB,wBAAqB;AACrB,6BAA0B;AAC1B,8BAA2B;AAC3B,qBAAkB;AAClB,wBAAqB;AACrB,yBAAsB;AACtB,8BAA2B","sourcesContent":["import './echo-send'\nimport './echo-receive'\nimport './sleep'\nimport './log'\nimport './publish'\nimport './http-get'\nimport './http-post'\nimport './graphql-query'\nimport './graphql-mutate'\nimport './local-graphql-query'\nimport './local-graphql-mutate'\nimport './sub-scenario'\nimport './stop-scenario'\nimport './book-up-scenario'\nimport './pick-pending-scenario'\nimport './reset-pending-queue'\nimport './empty-check'\nimport './goto'\nimport './end'\nimport './switch-goto'\nimport './switch-range-goto'\nimport './switch-scenario'\nimport './switch-range-scenario'\nimport './switch-set'\nimport './switch-range-set'\nimport './script'\nimport './database-query'\nimport './mqtt-subscribe'\nimport './mqtt-publish'\nimport './throw'\nimport './variables'\nimport './floating-point'\nimport './socket-listener'\nimport './random'\nimport './csv-readline'\nimport './data-mapper'\nimport './headless-post'\nimport './headless-scrap'\nimport './set-domain'\nimport './mssql-procedure'\nimport './oracle-procedure'\nimport './jsonata'\nimport './state-read'\nimport './state-write'\nimport './state-group-read'\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../server/engine/task/index.ts"],"names":[],"mappings":";;AAAA,uBAAoB;AACpB,0BAAuB;AACvB,mBAAgB;AAChB,iBAAc;AACd,qBAAkB;AAClB,sBAAmB;AACnB,uBAAoB;AACpB,2BAAwB;AACxB,4BAAyB;AACzB,iCAA8B;AAC9B,kCAA+B;AAC/B,0BAAuB;AACvB,2BAAwB;AACxB,8BAA2B;AAC3B,mCAAgC;AAChC,iCAA8B;AAC9B,yBAAsB;AACtB,kBAAe;AACf,iBAAc;AACd,yBAAsB;AACtB,+BAA4B;AAC5B,6BAA0B;AAC1B,mCAAgC;AAChC,wBAAqB;AACrB,8BAA2B;AAC3B,oBAAiB;AACjB,4BAAyB;AACzB,4BAAyB;AACzB,0BAAuB;AACvB,mBAAgB;AAChB,uBAAoB;AACpB,4BAAyB;AACzB,6BAA0B;AAC1B,oBAAiB;AACjB,0BAAuB;AACvB,yBAAsB;AACtB,2BAAwB;AACxB,4BAAyB;AACzB,wBAAqB;AACrB,6BAA0B;AAC1B,8BAA2B;AAC3B,qBAAkB;AAClB,wBAAqB;AACrB,yBAAsB;AACtB,8BAA2B;AAC3B,2BAAwB","sourcesContent":["import './echo-send'\nimport './echo-receive'\nimport './sleep'\nimport './log'\nimport './publish'\nimport './http-get'\nimport './http-post'\nimport './graphql-query'\nimport './graphql-mutate'\nimport './local-graphql-query'\nimport './local-graphql-mutate'\nimport './sub-scenario'\nimport './stop-scenario'\nimport './book-up-scenario'\nimport './pick-pending-scenario'\nimport './reset-pending-queue'\nimport './empty-check'\nimport './goto'\nimport './end'\nimport './switch-goto'\nimport './switch-range-goto'\nimport './switch-scenario'\nimport './switch-range-scenario'\nimport './switch-set'\nimport './switch-range-set'\nimport './script'\nimport './database-query'\nimport './mqtt-subscribe'\nimport './mqtt-publish'\nimport './throw'\nimport './variables'\nimport './floating-point'\nimport './socket-listener'\nimport './random'\nimport './csv-readline'\nimport './data-mapper'\nimport './headless-post'\nimport './headless-scrap'\nimport './set-domain'\nimport './mssql-procedure'\nimport './oracle-procedure'\nimport './jsonata'\nimport './state-read'\nimport './state-write'\nimport './state-group-read'\nimport './pyrun-execute'\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const task_registry_1 = require("../task-registry");
4
+ const connection_manager_1 = require("../connection-manager");
5
+ async function PyrunExecute(step, { logger, data, domain }) {
6
+ const { connection: connectionName, params } = step;
7
+ const pyrun = connection_manager_1.ConnectionManager.getConnectionInstanceByName(domain, connectionName);
8
+ if (!pyrun)
9
+ throw Error(`pyrun connection not found: ${connectionName}`);
10
+ const module = params.module;
11
+ const input = params.input || {};
12
+ const url = `${pyrun.endpoint}/api/run/${encodeURIComponent(module)}`;
13
+ const headers = { 'Content-Type': 'application/json' };
14
+ if (pyrun.token)
15
+ headers['Authorization'] = `Bearer ${pyrun.token}`;
16
+ const response = await fetch(url, {
17
+ method: 'POST',
18
+ headers,
19
+ body: JSON.stringify({ input })
20
+ });
21
+ if (!response.ok) {
22
+ const error = await response.text();
23
+ throw new Error(`pyrun-execute failed: ${response.status} ${error}`);
24
+ }
25
+ const { result, exit_code, stderr, stdout, duration } = await response.json();
26
+ if (stdout) {
27
+ logger.info(`pyrun-execute stdout: ${stdout}`);
28
+ }
29
+ if (stderr) {
30
+ logger.error(`pyrun-execute stderr: ${stderr}`);
31
+ }
32
+ if (exit_code !== 0) {
33
+ throw new Error(`pyrun-execute failed: ${exit_code}`);
34
+ }
35
+ return { data: result?.result };
36
+ }
37
+ PyrunExecute.parameterSpec = [
38
+ { type: 'string', name: 'module', label: 'module', required: true },
39
+ { type: 'key-values', name: 'input', label: 'input-params', required: false }
40
+ ];
41
+ PyrunExecute.help = 'integration/task/pyrun-execute';
42
+ task_registry_1.TaskRegistry.registerTaskHandler('pyrun-execute', PyrunExecute);
43
+ //# sourceMappingURL=pyrun-execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pyrun-execute.js","sourceRoot":"","sources":["../../../server/engine/task/pyrun-execute.ts"],"names":[],"mappings":";;AAAA,oDAA+C;AAC/C,8DAAyD;AAIzD,KAAK,UAAU,YAAY,CAAC,IAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE;IACnE,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAEnD,MAAM,KAAK,GAAG,sCAAiB,CAAC,2BAA2B,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IACnF,IAAI,CAAC,KAAK;QAAE,MAAM,KAAK,CAAC,+BAA+B,cAAc,EAAE,CAAC,CAAA;IAExE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAA;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAA;IAEhC,MAAM,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,YAAY,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAA;IACrE,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAS,CAAA;IAC7D,IAAI,KAAK,CAAC,KAAK;QAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,KAAK,CAAC,KAAK,EAAE,CAAA;IAEnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC;KAChC,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,KAAK,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;QACnC,MAAM,IAAI,KAAK,CAAC,yBAAyB,QAAQ,CAAC,MAAM,IAAI,KAAK,EAAE,CAAC,CAAA;IACtE,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;IAE7E,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,CAAC,KAAK,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAA;IACjD,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAA;IACvD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AACjC,CAAC;AAED,YAAY,CAAC,aAAa,GAAG;IAC3B,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;IACnE,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE;CAC9E,CAAA;AACD,YAAY,CAAC,IAAI,GAAG,gCAAgC,CAAA;AAEpD,4BAAY,CAAC,mBAAmB,CAAC,eAAe,EAAE,YAAY,CAAC,CAAA","sourcesContent":["import { TaskRegistry } from '../task-registry'\nimport { ConnectionManager } from '../connection-manager'\nimport { InputStep } from '../../service/step/step-type'\nimport { Context } from '../types'\n\nasync function PyrunExecute(step: InputStep, { logger, data, domain }) {\n const { connection: connectionName, params } = step\n\n const pyrun = ConnectionManager.getConnectionInstanceByName(domain, connectionName)\n if (!pyrun) throw Error(`pyrun connection not found: ${connectionName}`)\n\n const module = params.module\n const input = params.input || {}\n\n const url = `${pyrun.endpoint}/api/run/${encodeURIComponent(module)}`\n const headers = { 'Content-Type': 'application/json' } as any\n if (pyrun.token) headers['Authorization'] = `Bearer ${pyrun.token}`\n\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body: JSON.stringify({ input })\n })\n\n if (!response.ok) {\n const error = await response.text()\n throw new Error(`pyrun-execute failed: ${response.status} ${error}`)\n }\n\n const { result, exit_code, stderr, stdout, duration } = await response.json()\n\n if (stdout) {\n logger.info(`pyrun-execute stdout: ${stdout}`)\n }\n\n if (stderr) {\n logger.error(`pyrun-execute stderr: ${stderr}`)\n }\n\n if (exit_code !== 0) {\n throw new Error(`pyrun-execute failed: ${exit_code}`)\n }\n\n return { data: result?.result }\n}\n\nPyrunExecute.parameterSpec = [\n { type: 'string', name: 'module', label: 'module', required: true },\n { type: 'key-values', name: 'input', label: 'input-params', required: false }\n]\nPyrunExecute.help = 'integration/task/pyrun-execute'\n\nTaskRegistry.registerTaskHandler('pyrun-execute', PyrunExecute)\n"]}