@kweaver-ai/kweaver-sdk 0.4.0 → 0.4.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 ADDED
@@ -0,0 +1,139 @@
1
+ # @kweaver-ai/kweaver-sdk
2
+
3
+ TypeScript SDK and CLI for [KWeaver](https://github.com/kweaver-ai/kweaver-sdk) — gives AI agents and applications programmatic access to knowledge networks and Decision Agents.
4
+
5
+ [中文文档](README.zh.md)
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ # CLI (global)
11
+ npm install -g @kweaver-ai/kweaver-sdk
12
+
13
+ # Library
14
+ npm install @kweaver-ai/kweaver-sdk
15
+ ```
16
+
17
+ Requires **Node.js >= 22**.
18
+
19
+ ## Quick Start
20
+
21
+ ### Authenticate
22
+
23
+ ```bash
24
+ kweaver auth login https://your-kweaver-instance.com
25
+ ```
26
+
27
+ Or use environment variables:
28
+
29
+ ```bash
30
+ export KWEAVER_BASE_URL=https://your-kweaver-instance.com
31
+ export KWEAVER_TOKEN=your-token
32
+ ```
33
+
34
+ ### Simple API (recommended)
35
+
36
+ ```typescript
37
+ import kweaver from "@kweaver-ai/kweaver-sdk/kweaver";
38
+
39
+ // Zero-config: reads credentials saved by `kweaver auth login`
40
+ kweaver.configure({ config: true, bknId: "your-bkn-id", agentId: "your-agent-id" });
41
+
42
+ // Search the knowledge network
43
+ const results = await kweaver.search("What risks exist in the supply chain?");
44
+ for (const concept of results.concepts) console.log(concept.concept_name);
45
+
46
+ // Chat with an agent
47
+ const reply = await kweaver.chat("Summarise the top 3 risks");
48
+ console.log(reply.text);
49
+
50
+ // After modifying object types or adding datasources, rebuild the BKN index
51
+ await kweaver.weaver({ wait: true });
52
+
53
+ // List available BKNs and agents
54
+ const bknList = await kweaver.bkns();
55
+ const agentList = await kweaver.agents();
56
+ ```
57
+
58
+ ### Full Client API (advanced)
59
+
60
+ ```typescript
61
+ import { KWeaverClient } from "@kweaver-ai/kweaver-sdk";
62
+
63
+ // Zero-config: reads credentials saved by `kweaver auth login`
64
+ const client = new KWeaverClient();
65
+
66
+ // Or pass credentials explicitly
67
+ const client = new KWeaverClient({
68
+ baseUrl: "https://your-kweaver-instance.com",
69
+ accessToken: "your-token",
70
+ });
71
+
72
+ // Knowledge networks
73
+ const kns = await client.knowledgeNetworks.list({ limit: 10 });
74
+ const ots = await client.knowledgeNetworks.listObjectTypes("bkn-id");
75
+ const rts = await client.knowledgeNetworks.listRelationTypes("bkn-id");
76
+ const ats = await client.knowledgeNetworks.listActionTypes("bkn-id");
77
+
78
+ // Agent chat (single-shot)
79
+ const reply = await client.agents.chat("agent-id", "Hello");
80
+ console.log(reply.text, reply.conversationId);
81
+
82
+ // Agent chat (streaming)
83
+ await client.agents.stream("agent-id", "Hello", {
84
+ onTextDelta: (chunk) => process.stdout.write(chunk),
85
+ });
86
+
87
+ // BKN engine — instance queries, subgraph, action execution
88
+ const instances = await client.bkn.queryInstances("bkn-id", "ot-id", { limit: 20 });
89
+ const graph = await client.bkn.querySubgraph("bkn-id", { /* path spec */ });
90
+ await client.bkn.executeAction("bkn-id", "at-id", { /* params */ });
91
+ const logs = await client.bkn.listActionLogs("bkn-id");
92
+
93
+ // Context Loader (semantic search over a BKN via MCP)
94
+ const cl = client.contextLoader(mcpUrl, "bkn-id");
95
+ const results = await cl.search({ query: "hypertension treatment" });
96
+ ```
97
+
98
+ ## CLI Reference
99
+
100
+ ```
101
+ kweaver auth login/status/list/use/delete/logout
102
+ kweaver token
103
+ kweaver bkn list/get/stats/export/create/update/delete
104
+ kweaver bkn object-type list/get/create/update/delete/query/properties
105
+ kweaver bkn relation-type list/get/create/update/delete
106
+ kweaver bkn action-type list/query/execute
107
+ kweaver bkn subgraph
108
+ kweaver bkn action-execution get
109
+ kweaver bkn action-log list/get/cancel
110
+ kweaver agent list/get/chat/sessions/history
111
+ kweaver context-loader config set/use/list/show
112
+ kweaver context-loader kn-search/query-object-instance/...
113
+ kweaver call <path> [-X METHOD] [-d BODY] [-H header]
114
+ ```
115
+
116
+ ## Environment Variables
117
+
118
+ | Variable | Description |
119
+ |---|---|
120
+ | `KWEAVER_BASE_URL` | KWeaver instance URL |
121
+ | `KWEAVER_BUSINESS_DOMAIN` | Business domain identifier |
122
+ | `KWEAVER_TOKEN` | Access token |
123
+
124
+ ## Using with AI Agents
125
+
126
+ Install the KWeaver skill for Claude Code, Cursor, or other AI coding agents:
127
+
128
+ ```bash
129
+ npx skills add kweaver-ai/kweaver-sdk --skill kweaver-core
130
+ ```
131
+
132
+ ## Links
133
+
134
+ - [GitHub](https://github.com/kweaver-ai/kweaver-sdk)
135
+ - [Python SDK on PyPI](https://pypi.org/project/kweaver-sdk/)
136
+
137
+ ## License
138
+
139
+ MIT
package/README.zh.md ADDED
@@ -0,0 +1,139 @@
1
+ # @kweaver-ai/kweaver-sdk
2
+
3
+ KWeaver TypeScript SDK 和 CLI — 让 AI 智能体与应用程序以编程方式访问知识网络和 Decision Agent。
4
+
5
+ [English](README.md)
6
+
7
+ ## 安装
8
+
9
+ ```bash
10
+ # 全局安装 CLI
11
+ npm install -g @kweaver-ai/kweaver-sdk
12
+
13
+ # 作为库使用
14
+ npm install @kweaver-ai/kweaver-sdk
15
+ ```
16
+
17
+ 需要 **Node.js >= 22**。
18
+
19
+ ## 快速上手
20
+
21
+ ### 认证
22
+
23
+ ```bash
24
+ kweaver auth login https://your-kweaver-instance.com
25
+ ```
26
+
27
+ 或使用环境变量:
28
+
29
+ ```bash
30
+ export KWEAVER_BASE_URL=https://your-kweaver-instance.com
31
+ export KWEAVER_TOKEN=your-token
32
+ ```
33
+
34
+ ### 简洁 API(推荐)
35
+
36
+ ```typescript
37
+ import kweaver from "@kweaver-ai/kweaver-sdk/kweaver";
38
+
39
+ // 使用 `kweaver auth login` 保存的凭据,零配置
40
+ kweaver.configure({ config: true, bknId: "your-bkn-id", agentId: "your-agent-id" });
41
+
42
+ // 搜索知识网络
43
+ const results = await kweaver.search("供应链有哪些关键风险?");
44
+ for (const concept of results.concepts) console.log(concept.concept_name);
45
+
46
+ // 与 Agent 对话
47
+ const reply = await kweaver.chat("总结前三大风险");
48
+ console.log(reply.text);
49
+
50
+ // 接入数据源或修改对象类后,重建 BKN 索引
51
+ await kweaver.weaver({ wait: true });
52
+
53
+ // 查看所有 BKN 和 Agent
54
+ const bknList = await kweaver.bkns();
55
+ const agentList = await kweaver.agents();
56
+ ```
57
+
58
+ ### 底层客户端(高级用法)
59
+
60
+ ```typescript
61
+ import { KWeaverClient } from "@kweaver-ai/kweaver-sdk";
62
+
63
+ // 零配置:自动读取 `kweaver auth login` 保存的凭据
64
+ const client = new KWeaverClient();
65
+
66
+ // 或显式传入凭据
67
+ const client = new KWeaverClient({
68
+ baseUrl: "https://your-kweaver-instance.com",
69
+ accessToken: "your-token",
70
+ });
71
+
72
+ // 知识网络
73
+ const kns = await client.knowledgeNetworks.list({ limit: 10 });
74
+ const ots = await client.knowledgeNetworks.listObjectTypes("bkn-id");
75
+ const rts = await client.knowledgeNetworks.listRelationTypes("bkn-id");
76
+ const ats = await client.knowledgeNetworks.listActionTypes("bkn-id");
77
+
78
+ // Agent 对话(单次)
79
+ const reply = await client.agents.chat("agent-id", "你好");
80
+ console.log(reply.text, reply.conversationId);
81
+
82
+ // Agent 对话(流式)
83
+ await client.agents.stream("agent-id", "你好", {
84
+ onTextDelta: (chunk) => process.stdout.write(chunk),
85
+ });
86
+
87
+ // BKN 引擎:实例查询、子图、Action 执行
88
+ const instances = await client.bkn.queryInstances("bkn-id", "ot-id", { limit: 20 });
89
+ const graph = await client.bkn.querySubgraph("bkn-id", { /* 路径规格 */ });
90
+ await client.bkn.executeAction("bkn-id", "at-id", { /* 参数 */ });
91
+ const logs = await client.bkn.listActionLogs("bkn-id");
92
+
93
+ // Context Loader(通过 MCP 对 BKN 做语义搜索)
94
+ const cl = client.contextLoader(mcpUrl, "bkn-id");
95
+ const results = await cl.search({ query: "高血压 治疗" });
96
+ ```
97
+
98
+ ## 命令速查
99
+
100
+ ```
101
+ kweaver auth login/status/list/use/delete/logout
102
+ kweaver token
103
+ kweaver bkn list/get/stats/export/create/update/delete
104
+ kweaver bkn object-type list/get/create/update/delete/query/properties
105
+ kweaver bkn relation-type list/get/create/update/delete
106
+ kweaver bkn action-type list/query/execute
107
+ kweaver bkn subgraph
108
+ kweaver bkn action-execution get
109
+ kweaver bkn action-log list/get/cancel
110
+ kweaver agent list/get/chat/sessions/history
111
+ kweaver context-loader config set/use/list/show
112
+ kweaver context-loader kn-search/query-object-instance/...
113
+ kweaver call <path> [-X METHOD] [-d BODY] [-H header]
114
+ ```
115
+
116
+ ## 环境变量
117
+
118
+ | 变量 | 说明 |
119
+ |---|---|
120
+ | `KWEAVER_BASE_URL` | KWeaver 实例地址 |
121
+ | `KWEAVER_BUSINESS_DOMAIN` | 业务域标识 |
122
+ | `KWEAVER_TOKEN` | 访问令牌 |
123
+
124
+ ## 在 AI 智能体中使用
125
+
126
+ 为 Claude Code、Cursor 等 AI 编程助手安装 KWeaver 技能:
127
+
128
+ ```bash
129
+ npx skills add kweaver-ai/kweaver-sdk --skill kweaver-core
130
+ ```
131
+
132
+ ## 相关链接
133
+
134
+ - [GitHub](https://github.com/kweaver-ai/kweaver-sdk)
135
+ - [Python SDK on PyPI](https://pypi.org/project/kweaver-sdk/)
136
+
137
+ ## 许可证
138
+
139
+ MIT
@@ -10,3 +10,10 @@ export interface ListAgentsOptions {
10
10
  is_to_square?: number;
11
11
  }
12
12
  export declare function listAgents(options: ListAgentsOptions): Promise<string>;
13
+ export interface GetAgentOptions {
14
+ baseUrl: string;
15
+ accessToken: string;
16
+ agentId: string;
17
+ businessDomain?: string;
18
+ }
19
+ export declare function getAgent(options: GetAgentOptions): Promise<string>;
@@ -20,8 +20,6 @@ export async function listAgents(options) {
20
20
  token: accessToken,
21
21
  "x-business-domain": businessDomain,
22
22
  "x-language": "zh-CN",
23
- "x-requested-with": "XMLHttpRequest",
24
- "content-type": "application/json",
25
23
  },
26
24
  body,
27
25
  });
@@ -31,3 +29,24 @@ export async function listAgents(options) {
31
29
  }
32
30
  return responseBody;
33
31
  }
32
+ export async function getAgent(options) {
33
+ const { baseUrl, accessToken, agentId, businessDomain = "bd_public", } = options;
34
+ const base = baseUrl.replace(/\/+$/, "");
35
+ const url = `${base}/api/agent-factory/v3/agent/${encodeURIComponent(agentId)}`;
36
+ const response = await fetch(url, {
37
+ method: "GET",
38
+ headers: {
39
+ accept: "application/json, text/plain, */*",
40
+ "accept-language": "zh-CN",
41
+ authorization: `Bearer ${accessToken}`,
42
+ token: accessToken,
43
+ "x-business-domain": businessDomain,
44
+ "x-language": "zh-CN",
45
+ },
46
+ });
47
+ const responseBody = await response.text();
48
+ if (!response.ok) {
49
+ throw new HttpError(response.status, response.statusText, responseBody);
50
+ }
51
+ return responseBody;
52
+ }
@@ -0,0 +1,73 @@
1
+ export interface TestDatasourceOptions {
2
+ baseUrl: string;
3
+ accessToken: string;
4
+ type: string;
5
+ host: string;
6
+ port: number;
7
+ database: string;
8
+ account: string;
9
+ password: string;
10
+ schema?: string;
11
+ businessDomain?: string;
12
+ }
13
+ export declare function testDatasource(options: TestDatasourceOptions): Promise<void>;
14
+ export interface CreateDatasourceOptions {
15
+ baseUrl: string;
16
+ accessToken: string;
17
+ name: string;
18
+ type: string;
19
+ host: string;
20
+ port: number;
21
+ database: string;
22
+ account: string;
23
+ password: string;
24
+ schema?: string;
25
+ comment?: string;
26
+ businessDomain?: string;
27
+ }
28
+ export declare function createDatasource(options: CreateDatasourceOptions): Promise<string>;
29
+ export interface ListDatasourcesOptions {
30
+ baseUrl: string;
31
+ accessToken: string;
32
+ keyword?: string;
33
+ type?: string;
34
+ businessDomain?: string;
35
+ }
36
+ export declare function listDatasources(options: ListDatasourcesOptions): Promise<string>;
37
+ export interface GetDatasourceOptions {
38
+ baseUrl: string;
39
+ accessToken: string;
40
+ id: string;
41
+ businessDomain?: string;
42
+ }
43
+ export declare function getDatasource(options: GetDatasourceOptions): Promise<string>;
44
+ export interface DeleteDatasourceOptions {
45
+ baseUrl: string;
46
+ accessToken: string;
47
+ id: string;
48
+ businessDomain?: string;
49
+ }
50
+ export declare function deleteDatasource(options: DeleteDatasourceOptions): Promise<void>;
51
+ export interface ListTablesOptions {
52
+ baseUrl: string;
53
+ accessToken: string;
54
+ id: string;
55
+ keyword?: string;
56
+ limit?: number;
57
+ offset?: number;
58
+ businessDomain?: string;
59
+ }
60
+ export declare function listTables(options: ListTablesOptions): Promise<string>;
61
+ export interface ListTablesWithColumnsOptions extends ListTablesOptions {
62
+ autoScan?: boolean;
63
+ }
64
+ /** List tables with column details. Optionally triggers metadata scan if no tables found. */
65
+ export declare function listTablesWithColumns(options: ListTablesWithColumnsOptions): Promise<string>;
66
+ export interface ScanMetadataOptions {
67
+ baseUrl: string;
68
+ accessToken: string;
69
+ id: string;
70
+ dsType?: string;
71
+ businessDomain?: string;
72
+ }
73
+ export declare function scanMetadata(options: ScanMetadataOptions): Promise<string>;
@@ -0,0 +1,218 @@
1
+ import { HttpError } from "../utils/http.js";
2
+ import { encryptPassword } from "../utils/crypto.js";
3
+ const HTTPS_PROTOCOLS = new Set(["maxcompute", "anyshare7", "opensearch"]);
4
+ function connectProtocol(dsType) {
5
+ return HTTPS_PROTOCOLS.has(dsType) ? "https" : "jdbc";
6
+ }
7
+ function makeBinData(type, host, port, database, account, password, schema) {
8
+ const d = {
9
+ host,
10
+ port,
11
+ database_name: database,
12
+ connect_protocol: connectProtocol(type),
13
+ account,
14
+ password: encryptPassword(password),
15
+ };
16
+ if (schema !== undefined && schema !== "") {
17
+ d.schema = schema;
18
+ }
19
+ return d;
20
+ }
21
+ function buildHeaders(accessToken, businessDomain) {
22
+ return {
23
+ accept: "application/json, text/plain, */*",
24
+ "accept-language": "zh-cn",
25
+ authorization: `Bearer ${accessToken}`,
26
+ token: accessToken,
27
+ "x-business-domain": businessDomain,
28
+ "x-language": "zh-cn",
29
+ };
30
+ }
31
+ export async function testDatasource(options) {
32
+ const { baseUrl, accessToken, type, host, port, database, account, password, schema, businessDomain = "bd_public", } = options;
33
+ const base = baseUrl.replace(/\/+$/, "");
34
+ const url = `${base}/api/data-connection/v1/datasource/test`;
35
+ const body = JSON.stringify({
36
+ type,
37
+ bin_data: makeBinData(type, host, port, database, account, password, schema),
38
+ });
39
+ const response = await fetch(url, {
40
+ method: "POST",
41
+ headers: {
42
+ ...buildHeaders(accessToken, businessDomain),
43
+ "content-type": "application/json",
44
+ },
45
+ body,
46
+ });
47
+ if (!response.ok) {
48
+ const responseBody = await response.text();
49
+ throw new HttpError(response.status, response.statusText, responseBody);
50
+ }
51
+ }
52
+ export async function createDatasource(options) {
53
+ const { baseUrl, accessToken, name, type, host, port, database, account, password, schema, comment, businessDomain = "bd_public", } = options;
54
+ const base = baseUrl.replace(/\/+$/, "");
55
+ const url = `${base}/api/data-connection/v1/datasource`;
56
+ const bodyObj = {
57
+ name,
58
+ type,
59
+ bin_data: makeBinData(type, host, port, database, account, password, schema),
60
+ };
61
+ if (comment) {
62
+ bodyObj.comment = comment;
63
+ }
64
+ const response = await fetch(url, {
65
+ method: "POST",
66
+ headers: {
67
+ ...buildHeaders(accessToken, businessDomain),
68
+ "content-type": "application/json",
69
+ },
70
+ body: JSON.stringify(bodyObj),
71
+ });
72
+ const responseBody = await response.text();
73
+ if (!response.ok) {
74
+ throw new HttpError(response.status, response.statusText, responseBody);
75
+ }
76
+ return responseBody;
77
+ }
78
+ export async function listDatasources(options) {
79
+ const { baseUrl, accessToken, keyword, type, businessDomain = "bd_public", } = options;
80
+ const base = baseUrl.replace(/\/+$/, "");
81
+ const url = new URL(`${base}/api/data-connection/v1/datasource`);
82
+ if (keyword)
83
+ url.searchParams.set("keyword", keyword);
84
+ if (type)
85
+ url.searchParams.set("type", type);
86
+ const response = await fetch(url.toString(), {
87
+ method: "GET",
88
+ headers: buildHeaders(accessToken, businessDomain),
89
+ });
90
+ const body = await response.text();
91
+ if (!response.ok) {
92
+ throw new HttpError(response.status, response.statusText, body);
93
+ }
94
+ return body;
95
+ }
96
+ export async function getDatasource(options) {
97
+ const { baseUrl, accessToken, id, businessDomain = "bd_public", } = options;
98
+ const base = baseUrl.replace(/\/+$/, "");
99
+ const url = `${base}/api/data-connection/v1/datasource/${encodeURIComponent(id)}`;
100
+ const response = await fetch(url, {
101
+ method: "GET",
102
+ headers: buildHeaders(accessToken, businessDomain),
103
+ });
104
+ const body = await response.text();
105
+ if (!response.ok) {
106
+ throw new HttpError(response.status, response.statusText, body);
107
+ }
108
+ return body;
109
+ }
110
+ export async function deleteDatasource(options) {
111
+ const { baseUrl, accessToken, id, businessDomain = "bd_public", } = options;
112
+ const base = baseUrl.replace(/\/+$/, "");
113
+ const url = `${base}/api/data-connection/v1/datasource/${encodeURIComponent(id)}`;
114
+ const response = await fetch(url, {
115
+ method: "DELETE",
116
+ headers: buildHeaders(accessToken, businessDomain),
117
+ });
118
+ if (!response.ok) {
119
+ const body = await response.text();
120
+ throw new HttpError(response.status, response.statusText, body);
121
+ }
122
+ }
123
+ export async function listTables(options) {
124
+ const { baseUrl, accessToken, id, keyword, limit = -1, offset, businessDomain = "bd_public", } = options;
125
+ const base = baseUrl.replace(/\/+$/, "");
126
+ const url = new URL(`${base}/api/data-connection/v1/metadata/data-source/${encodeURIComponent(id)}`);
127
+ url.searchParams.set("limit", String(limit));
128
+ if (keyword)
129
+ url.searchParams.set("keyword", keyword);
130
+ if (offset !== undefined)
131
+ url.searchParams.set("offset", String(offset));
132
+ const response = await fetch(url.toString(), {
133
+ method: "GET",
134
+ headers: buildHeaders(accessToken, businessDomain),
135
+ });
136
+ const body = await response.text();
137
+ if (!response.ok) {
138
+ throw new HttpError(response.status, response.statusText, body);
139
+ }
140
+ return body;
141
+ }
142
+ /** List tables with column details. Optionally triggers metadata scan if no tables found. */
143
+ export async function listTablesWithColumns(options) {
144
+ const { id, autoScan = true, ...rest } = options;
145
+ let body = await listTables({ ...rest, id });
146
+ const parsed = JSON.parse(body);
147
+ let items = Array.isArray(parsed) ? parsed : (parsed.entries ?? parsed.data ?? []);
148
+ if (items.length === 0 && autoScan) {
149
+ await scanMetadata({
150
+ baseUrl: rest.baseUrl,
151
+ accessToken: rest.accessToken,
152
+ id,
153
+ businessDomain: rest.businessDomain,
154
+ });
155
+ body = await listTables({ ...rest, id });
156
+ const parsed2 = JSON.parse(body);
157
+ items = Array.isArray(parsed2) ? parsed2 : (parsed2.entries ?? parsed2.data ?? []);
158
+ }
159
+ const base = rest.baseUrl.replace(/\/+$/, "");
160
+ const tables = [];
161
+ for (const t of items) {
162
+ const tableId = String(t.id ?? "");
163
+ const tableName = String(t.name ?? "");
164
+ let columnsRaw = (t.columns ?? t.fields ?? []);
165
+ if (columnsRaw.length === 0 && tableId) {
166
+ const tableUrl = `${base}/api/data-connection/v1/metadata/table/${encodeURIComponent(tableId)}?limit=-1`;
167
+ const colResponse = await fetch(tableUrl, {
168
+ method: "GET",
169
+ headers: buildHeaders(rest.accessToken, rest.businessDomain ?? "bd_public"),
170
+ });
171
+ const colData = (await colResponse.json());
172
+ columnsRaw = Array.isArray(colData) ? colData : (colData.entries ?? colData.data ?? []);
173
+ }
174
+ const columns = columnsRaw.map((c) => ({
175
+ name: String(c.name ?? c.field_name ?? ""),
176
+ type: String(c.type ?? c.field_type ?? "varchar"),
177
+ comment: typeof c.comment === "string" ? c.comment : undefined,
178
+ }));
179
+ tables.push({ name: tableName, columns });
180
+ }
181
+ return JSON.stringify(tables);
182
+ }
183
+ export async function scanMetadata(options) {
184
+ const { baseUrl, accessToken, id, dsType = "mysql", businessDomain = "bd_public", } = options;
185
+ const base = baseUrl.replace(/\/+$/, "");
186
+ const scanUrl = `${base}/api/data-connection/v1/metadata/scan`;
187
+ const statusUrl = (taskId) => `${base}/api/data-connection/v1/metadata/scan/${taskId}`;
188
+ const scanBody = JSON.stringify({
189
+ scan_name: `sdk_scan_${id.slice(0, 8)}`,
190
+ type: 0,
191
+ ds_info: { ds_id: id, ds_type: dsType },
192
+ use_default_template: true,
193
+ use_multi_threads: true,
194
+ status: "open",
195
+ });
196
+ const scanResponse = await fetch(scanUrl, {
197
+ method: "POST",
198
+ headers: {
199
+ ...buildHeaders(accessToken, businessDomain),
200
+ "content-type": "application/json",
201
+ },
202
+ body: scanBody,
203
+ });
204
+ const scanResult = await scanResponse.json();
205
+ const taskId = scanResult.id ?? "";
206
+ for (let i = 0; i < 30; i += 1) {
207
+ await new Promise((r) => setTimeout(r, 2000));
208
+ const statusResponse = await fetch(statusUrl(taskId), {
209
+ method: "GET",
210
+ headers: buildHeaders(accessToken, businessDomain),
211
+ });
212
+ const statusData = (await statusResponse.json());
213
+ if (statusData.status === "success" || statusData.status === "fail") {
214
+ break;
215
+ }
216
+ }
217
+ return taskId;
218
+ }
@@ -0,0 +1,20 @@
1
+ export interface CreateDataViewOptions {
2
+ baseUrl: string;
3
+ accessToken: string;
4
+ name: string;
5
+ datasourceId: string;
6
+ table: string;
7
+ fields?: Array<{
8
+ name: string;
9
+ type: string;
10
+ }>;
11
+ businessDomain?: string;
12
+ }
13
+ export declare function createDataView(options: CreateDataViewOptions): Promise<string>;
14
+ export interface GetDataViewOptions {
15
+ baseUrl: string;
16
+ accessToken: string;
17
+ id: string;
18
+ businessDomain?: string;
19
+ }
20
+ export declare function getDataView(options: GetDataViewOptions): Promise<string>;