@insta-dev01/insta-plugin-openclaw 1.0.0 → 1.0.2
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/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +171 -0
- package/dist/index.js.map +1 -0
- package/dist/src/channel/config.d.ts +9 -0
- package/dist/src/channel/config.d.ts.map +1 -0
- package/dist/src/channel/config.js +10 -0
- package/dist/src/channel/config.js.map +1 -0
- package/dist/src/channel/connection.d.ts +34 -0
- package/dist/src/channel/connection.d.ts.map +1 -0
- package/dist/src/channel/connection.js +281 -0
- package/dist/src/channel/connection.js.map +1 -0
- package/dist/src/channel/dispatcher.d.ts +43 -0
- package/dist/src/channel/dispatcher.d.ts.map +1 -0
- package/dist/src/channel/dispatcher.js +324 -0
- package/dist/src/channel/dispatcher.js.map +1 -0
- package/dist/src/channel/index.d.ts +5 -0
- package/dist/src/channel/index.d.ts.map +1 -0
- package/dist/src/channel/index.js +135 -0
- package/dist/src/channel/index.js.map +1 -0
- package/dist/src/channel/logger.d.ts +10 -0
- package/dist/src/channel/logger.d.ts.map +1 -0
- package/dist/src/channel/logger.js +30 -0
- package/dist/src/channel/logger.js.map +1 -0
- package/dist/src/channel/protocol.d.ts +15 -0
- package/dist/src/channel/protocol.d.ts.map +1 -0
- package/dist/src/channel/protocol.js +204 -0
- package/dist/src/channel/protocol.js.map +1 -0
- package/dist/src/channel/registrar.d.ts +21 -0
- package/dist/src/channel/registrar.d.ts.map +1 -0
- package/dist/src/channel/registrar.js +115 -0
- package/dist/src/channel/registrar.js.map +1 -0
- package/dist/src/channel/registration-store.d.ts +21 -0
- package/dist/src/channel/registration-store.d.ts.map +1 -0
- package/{src/channel/registration-store.ts → dist/src/channel/registration-store.js} +21 -46
- package/dist/src/channel/registration-store.js.map +1 -0
- package/dist/src/channel/types.d.ts +80 -0
- package/dist/src/channel/types.d.ts.map +1 -0
- package/dist/src/channel/types.js +3 -0
- package/dist/src/channel/types.js.map +1 -0
- package/dist/src/core/index.d.ts +5 -0
- package/dist/src/core/index.d.ts.map +1 -0
- package/dist/src/core/index.js +3 -0
- package/dist/src/core/index.js.map +1 -0
- package/dist/src/core/register-identity.d.ts +58 -0
- package/dist/src/core/register-identity.d.ts.map +1 -0
- package/dist/src/core/register-identity.js +251 -0
- package/dist/src/core/register-identity.js.map +1 -0
- package/dist/src/core/task-api.d.ts +31 -0
- package/dist/src/core/task-api.d.ts.map +1 -0
- package/dist/src/core/task-api.js +116 -0
- package/dist/src/core/task-api.js.map +1 -0
- package/dist/src/core/urls.d.ts +33 -0
- package/dist/src/core/urls.d.ts.map +1 -0
- package/dist/src/core/urls.js +40 -0
- package/dist/src/core/urls.js.map +1 -0
- package/dist/src/tools/get-plugin-profile.d.ts +7 -0
- package/dist/src/tools/get-plugin-profile.d.ts.map +1 -0
- package/dist/src/tools/get-plugin-profile.js +132 -0
- package/dist/src/tools/get-plugin-profile.js.map +1 -0
- package/dist/src/tools/grab-task.d.ts +7 -0
- package/dist/src/tools/grab-task.d.ts.map +1 -0
- package/dist/src/tools/grab-task.js +100 -0
- package/dist/src/tools/grab-task.js.map +1 -0
- package/dist/src/tools/list-tasks.d.ts +7 -0
- package/dist/src/tools/list-tasks.d.ts.map +1 -0
- package/dist/src/tools/list-tasks.js +92 -0
- package/dist/src/tools/list-tasks.js.map +1 -0
- package/dist/src/tools/propose-registration.d.ts +14 -0
- package/dist/src/tools/propose-registration.d.ts.map +1 -0
- package/dist/src/tools/propose-registration.js +103 -0
- package/dist/src/tools/propose-registration.js.map +1 -0
- package/dist/src/tools/register-identity.d.ts +11 -0
- package/dist/src/tools/register-identity.d.ts.map +1 -0
- package/dist/src/tools/register-identity.js +101 -0
- package/dist/src/tools/register-identity.js.map +1 -0
- package/dist/src/tools/submit-deliverable.d.ts +17 -0
- package/dist/src/tools/submit-deliverable.d.ts.map +1 -0
- package/dist/src/tools/submit-deliverable.js +215 -0
- package/dist/src/tools/submit-deliverable.js.map +1 -0
- package/dist/src/tools/upload-artifact.d.ts +14 -0
- package/dist/src/tools/upload-artifact.d.ts.map +1 -0
- package/dist/src/tools/upload-artifact.js +166 -0
- package/dist/src/tools/upload-artifact.js.map +1 -0
- package/dist/src/utils/file-lock.d.ts +4 -0
- package/dist/src/utils/file-lock.d.ts.map +1 -0
- package/dist/src/utils/file-lock.js +43 -0
- package/dist/src/utils/file-lock.js.map +1 -0
- package/dist/src/utils/profile.d.ts +17 -0
- package/dist/src/utils/profile.d.ts.map +1 -0
- package/dist/src/utils/profile.js +26 -0
- package/dist/src/utils/profile.js.map +1 -0
- package/dist/src/utils/session.d.ts +3 -0
- package/dist/src/utils/session.d.ts.map +1 -0
- package/dist/src/utils/session.js +26 -0
- package/dist/src/utils/session.js.map +1 -0
- package/package.json +17 -5
- package/.env.example +0 -23
- package/channel/346/265/201/347/250/213/345/233/276.md +0 -477
- package/index.ts +0 -198
- package/src/channel/config.ts +0 -27
- package/src/channel/connection.ts +0 -341
- package/src/channel/dispatcher.ts +0 -374
- package/src/channel/index.ts +0 -173
- package/src/channel/logger.ts +0 -36
- package/src/channel/protocol.ts +0 -265
- package/src/channel/registrar.ts +0 -172
- package/src/channel/types.ts +0 -102
- package/src/core/index.ts +0 -13
- package/src/core/register-identity.ts +0 -326
- package/src/core/task-api.ts +0 -168
- package/src/core/urls.ts +0 -52
- package/src/prompt/job.md +0 -21
- package/src/tools/get-plugin-profile.ts +0 -152
- package/src/tools/grab-task.ts +0 -133
- package/src/tools/list-tasks.ts +0 -135
- package/src/tools/propose-registration.ts +0 -116
- package/src/tools/register-identity.ts +0 -121
- package/src/tools/submit-deliverable.ts +0 -268
- package/src/tools/upload-artifact.ts +0 -222
- package/src/utils/file-lock.ts +0 -43
- package/src/utils/profile.ts +0 -45
- package/src/utils/session.ts +0 -30
- package/tests/profile.test.ts +0 -70
- package/tests/session.test.ts +0 -53
- package/tsconfig.json +0 -49
- package/vitest.config.ts +0 -26
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit-deliverable.d.ts","sourceRoot":"","sources":["../../../src/tools/submit-deliverable.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAkF1C;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,4BAA4B,EAAE,yBAkK1C,CAAC"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import { createWriteStream, existsSync } from "node:fs";
|
|
2
|
+
import { readdir, stat, readFile } from "node:fs/promises";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { randomBytes } from "node:crypto";
|
|
6
|
+
import archiver from "archiver";
|
|
7
|
+
import { taskApiPostMultipart } from "../core/task-api.js";
|
|
8
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
9
|
+
// 工具参数 JSON Schema
|
|
10
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
11
|
+
const SUBMIT_DELIVERABLE_PARAMS = {
|
|
12
|
+
type: "object",
|
|
13
|
+
properties: {
|
|
14
|
+
task_id: {
|
|
15
|
+
type: "string",
|
|
16
|
+
description: "已认领任务的 UUID(通过 insta_grab_task 抢单成功后获得)",
|
|
17
|
+
},
|
|
18
|
+
artifact_path: {
|
|
19
|
+
type: "string",
|
|
20
|
+
description: "产物路径(绝对路径)。" +
|
|
21
|
+
"若为目录,将自动递归打包成 ZIP 后提交;" +
|
|
22
|
+
"若为文件(含 .zip),直接上传,无需额外打包。",
|
|
23
|
+
},
|
|
24
|
+
result_description: {
|
|
25
|
+
type: "string",
|
|
26
|
+
description: "任务执行结果描述/报告(必填文字说明)。" +
|
|
27
|
+
"请用简洁语言描述本次任务的执行结论、关键产出和注意事项," +
|
|
28
|
+
"此文本将与产物文件一并提交给任务发布方。",
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
required: ["task_id", "artifact_path", "result_description"],
|
|
32
|
+
additionalProperties: false,
|
|
33
|
+
};
|
|
34
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
35
|
+
// 内部工具:将目录打包为 ZIP(写入临时文件)
|
|
36
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
37
|
+
/**
|
|
38
|
+
* 将指定目录递归打包成 ZIP 文件,写到系统临时目录。
|
|
39
|
+
*
|
|
40
|
+
* @param dirPath 需要打包的目录绝对路径
|
|
41
|
+
* @returns 生成的临时 ZIP 文件绝对路径
|
|
42
|
+
*/
|
|
43
|
+
async function packDirectoryToZip(dirPath) {
|
|
44
|
+
const suffix = randomBytes(6).toString("hex");
|
|
45
|
+
const zipName = `insta_delivery_${suffix}.zip`;
|
|
46
|
+
const zipPath = join(tmpdir(), zipName);
|
|
47
|
+
await new Promise((resolve, reject) => {
|
|
48
|
+
const output = createWriteStream(zipPath);
|
|
49
|
+
const archive = archiver("zip", { zlib: { level: 6 } });
|
|
50
|
+
output.on("close", resolve);
|
|
51
|
+
archive.on("error", reject);
|
|
52
|
+
archive.pipe(output);
|
|
53
|
+
// 将整个目录添加进 zip(保留目录内部结构,根节点命名与目录名一致)
|
|
54
|
+
archive.directory(dirPath, basename(dirPath));
|
|
55
|
+
archive.finalize();
|
|
56
|
+
});
|
|
57
|
+
return zipPath;
|
|
58
|
+
}
|
|
59
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
60
|
+
// 工具:insta_submit_deliverable
|
|
61
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
62
|
+
/**
|
|
63
|
+
* 提交任务产物工具工厂函数。
|
|
64
|
+
*
|
|
65
|
+
* 功能:
|
|
66
|
+
* 1. 校验 task_id / artifact_path / result_description
|
|
67
|
+
* 2. 判断 artifact_path 是目录还是文件:
|
|
68
|
+
* - 目录 → 调用 archiver 递归打包成 ZIP
|
|
69
|
+
* - 文件 → 直接读取使用
|
|
70
|
+
* 3. 通过 multipart/form-data POST 到 /bots/tasks/{task_id}/deliverable
|
|
71
|
+
* 字段:result_description(文本)+ zip_file(文件)
|
|
72
|
+
* 4. 服务端收到后自动将任务状态流转为 completed,无需手动调用状态更新接口
|
|
73
|
+
*
|
|
74
|
+
* 在 index.ts 中通过 api.registerTool(submitDeliverableToolFactory) 注册。
|
|
75
|
+
*/
|
|
76
|
+
export const submitDeliverableToolFactory = (ctx) => {
|
|
77
|
+
return {
|
|
78
|
+
name: "insta_submit_deliverable",
|
|
79
|
+
label: "打包并提交引态任务产物",
|
|
80
|
+
description: [
|
|
81
|
+
"将本地产物文件或目录打包提交到引态(Instaon)任务系统,完成任务交付。",
|
|
82
|
+
"提交成功后任务状态将自动流转为「已完成(completed)」,无需手动更新状态。",
|
|
83
|
+
"参数说明:",
|
|
84
|
+
" · task_id(必填):已认领任务的 UUID,可通过 insta_grab_task 抢单后获取。",
|
|
85
|
+
" · artifact_path(必填):产物路径(绝对路径)。",
|
|
86
|
+
" - 若指向目录:自动递归打包成 ZIP 后提交。",
|
|
87
|
+
" - 若指向文件(含 .zip):直接上传,不额外打包。",
|
|
88
|
+
" · result_description(必填):任务执行结果的文字说明/报告,",
|
|
89
|
+
" 将与产物文件一并提交给任务发布方。",
|
|
90
|
+
"返回说明:",
|
|
91
|
+
" · ok=true:提交成功,data 中包含 result_zip_url 等链接信息。",
|
|
92
|
+
" · ok=false:提交失败,error 中包含具体原因。",
|
|
93
|
+
"认证方式:自动读取本地 profile.json 中的 app_key / app_secret。",
|
|
94
|
+
].join("\n"),
|
|
95
|
+
parameters: SUBMIT_DELIVERABLE_PARAMS,
|
|
96
|
+
execute: async (_toolCallId, params) => {
|
|
97
|
+
let tempZipPath = null;
|
|
98
|
+
try {
|
|
99
|
+
const p = params;
|
|
100
|
+
const taskId = typeof p["task_id"] === "string" ? p["task_id"].trim() : "";
|
|
101
|
+
const artifactPath = typeof p["artifact_path"] === "string" ? p["artifact_path"].trim() : "";
|
|
102
|
+
const resultDescription = typeof p["result_description"] === "string"
|
|
103
|
+
? p["result_description"].trim()
|
|
104
|
+
: "";
|
|
105
|
+
// ── Step 1: 参数校验 ─────────────────────────────────────────────────
|
|
106
|
+
if (!taskId) {
|
|
107
|
+
const err = { ok: false, error: "缺少必填参数:task_id(任务 UUID)" };
|
|
108
|
+
return {
|
|
109
|
+
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
110
|
+
details: err,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
if (!artifactPath) {
|
|
114
|
+
const err = { ok: false, error: "缺少必填参数:artifact_path(产物路径)" };
|
|
115
|
+
return {
|
|
116
|
+
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
117
|
+
details: err,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (!resultDescription) {
|
|
121
|
+
const err = {
|
|
122
|
+
ok: false,
|
|
123
|
+
error: "缺少必填参数:result_description(任务执行结果描述)",
|
|
124
|
+
};
|
|
125
|
+
return {
|
|
126
|
+
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
127
|
+
details: err,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
if (!existsSync(artifactPath)) {
|
|
131
|
+
const err = { ok: false, error: `产物路径不存在:${artifactPath}` };
|
|
132
|
+
return {
|
|
133
|
+
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
134
|
+
details: err,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
// ── Step 2: 判断路径类型,必要时打包 ZIP ─────────────────────────────
|
|
138
|
+
const pathStat = await stat(artifactPath);
|
|
139
|
+
let uploadFilePath;
|
|
140
|
+
let packed = false;
|
|
141
|
+
if (pathStat.isDirectory()) {
|
|
142
|
+
// 目录 → 先检查是否为空目录
|
|
143
|
+
const entries = await readdir(artifactPath);
|
|
144
|
+
if (entries.length === 0) {
|
|
145
|
+
const err = { ok: false, error: `产物目录为空,无法提交:${artifactPath}` };
|
|
146
|
+
return {
|
|
147
|
+
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
148
|
+
details: err,
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
// 打包成 zip
|
|
152
|
+
tempZipPath = await packDirectoryToZip(artifactPath);
|
|
153
|
+
uploadFilePath = tempZipPath;
|
|
154
|
+
packed = true;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// 普通文件 → 直接上传
|
|
158
|
+
uploadFilePath = artifactPath;
|
|
159
|
+
}
|
|
160
|
+
// ── Step 3: 读取文件,构造 multipart/form-data ────────────────────────
|
|
161
|
+
const fileBuffer = await readFile(uploadFilePath);
|
|
162
|
+
const filename = basename(uploadFilePath);
|
|
163
|
+
const blob = new Blob([fileBuffer], { type: "application/zip" });
|
|
164
|
+
const formData = new FormData();
|
|
165
|
+
formData.append("result_description", resultDescription);
|
|
166
|
+
formData.append("zip_file", blob, filename);
|
|
167
|
+
// ── Step 4: 调用交付物上传接口 ────────────────────────────────────────
|
|
168
|
+
const baseDir = ctx.agentDir ?? ctx.workspaceDir ?? process.cwd();
|
|
169
|
+
const resp = await taskApiPostMultipart(baseDir, `/bots/tasks/${taskId}/deliverable`, formData);
|
|
170
|
+
if (resp.code !== 0) {
|
|
171
|
+
const err = {
|
|
172
|
+
ok: false,
|
|
173
|
+
code: resp.code,
|
|
174
|
+
error: resp.message ?? "提交交付物失败",
|
|
175
|
+
};
|
|
176
|
+
return {
|
|
177
|
+
content: [{ type: "text", text: JSON.stringify(err, null, 2) }],
|
|
178
|
+
details: err,
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
// ── Step 5: 返回成功结果 ──────────────────────────────────────────────
|
|
182
|
+
const result = {
|
|
183
|
+
ok: true,
|
|
184
|
+
task_id: taskId,
|
|
185
|
+
packed_from_directory: packed,
|
|
186
|
+
uploaded_filename: filename,
|
|
187
|
+
data: resp.data ?? {},
|
|
188
|
+
message: "产物提交成功,任务状态已自动流转为「已完成」",
|
|
189
|
+
};
|
|
190
|
+
return {
|
|
191
|
+
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
192
|
+
details: result,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
catch (e) {
|
|
196
|
+
const message = e instanceof Error ? e.message : "提交产物过程中发生未知错误";
|
|
197
|
+
const err = { ok: false, error: message };
|
|
198
|
+
return {
|
|
199
|
+
content: [{ type: "text", text: message }],
|
|
200
|
+
details: err,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
finally {
|
|
204
|
+
// ── 清理临时 ZIP 文件 ─────────────────────────────────────────────────
|
|
205
|
+
if (tempZipPath) {
|
|
206
|
+
const { unlink } = await import("node:fs/promises");
|
|
207
|
+
await unlink(tempZipPath).catch(() => {
|
|
208
|
+
// 清理失败不影响主流程,静默处理
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
};
|
|
215
|
+
//# sourceMappingURL=submit-deliverable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"submit-deliverable.js","sourceRoot":"","sources":["../../../src/tools/submit-deliverable.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { OpenClawPluginToolFactory } from "openclaw/plugin-sdk/plugin-entry";
|
|
2
|
+
/**
|
|
3
|
+
* 制品文件上传工具工厂函数。
|
|
4
|
+
*
|
|
5
|
+
* 功能:
|
|
6
|
+
* 1. 校验本地文件是否存在
|
|
7
|
+
* 2. 通过 multipart/form-data POST 到引态制品上传接口
|
|
8
|
+
* 3. 可选传入 sessionId,将制品与雇佣会话自动绑定
|
|
9
|
+
* 4. 解析并返回服务端响应(含下载地址等信息)
|
|
10
|
+
*
|
|
11
|
+
* 在 index.ts 中通过 api.registerTool(uploadArtifactToolFactory) 注册。
|
|
12
|
+
*/
|
|
13
|
+
export declare const uploadArtifactToolFactory: OpenClawPluginToolFactory;
|
|
14
|
+
//# sourceMappingURL=upload-artifact.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-artifact.d.ts","sourceRoot":"","sources":["../../../src/tools/upload-artifact.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AAgF1C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,yBAAyB,EAAE,yBA4HvC,CAAC"}
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { basename } from "node:path";
|
|
4
|
+
import { getInstaUrl } from "../core/urls.js";
|
|
5
|
+
import { readProfile } from "../utils/profile.js";
|
|
6
|
+
/**
|
|
7
|
+
* 将服务端原始响应解析为强类型结构。
|
|
8
|
+
* 若必填字段缺失则返回 null,由调用方透传原始数据。
|
|
9
|
+
*/
|
|
10
|
+
function parseUploadAndBindResponse(raw) {
|
|
11
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
const obj = raw;
|
|
15
|
+
// upload 字段为必须
|
|
16
|
+
if (obj["upload"] === null ||
|
|
17
|
+
typeof obj["upload"] !== "object" ||
|
|
18
|
+
Array.isArray(obj["upload"])) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
return raw;
|
|
22
|
+
}
|
|
23
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
24
|
+
// 工具参数 JSON Schema
|
|
25
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
26
|
+
const UPLOAD_PARAMS = {
|
|
27
|
+
type: "object",
|
|
28
|
+
properties: {
|
|
29
|
+
filePath: {
|
|
30
|
+
type: "string",
|
|
31
|
+
description: "需要上传的本地文件的绝对路径",
|
|
32
|
+
},
|
|
33
|
+
sessionId: {
|
|
34
|
+
type: "string",
|
|
35
|
+
description: "当前雇佣会话的 sessionId。处于用户雇佣会话时必须传入," +
|
|
36
|
+
"上传完成后会自动将文件与该会话关联。" +
|
|
37
|
+
"如果系统提示词中包含【当前会话信息】,请将其中的 sessionId 值传入此参数。",
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
required: ["filePath"],
|
|
41
|
+
additionalProperties: false,
|
|
42
|
+
};
|
|
43
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
44
|
+
// 工具:insta_upload_artifact
|
|
45
|
+
// ──────────────────────────────────────────────────────────────────────────────
|
|
46
|
+
/**
|
|
47
|
+
* 制品文件上传工具工厂函数。
|
|
48
|
+
*
|
|
49
|
+
* 功能:
|
|
50
|
+
* 1. 校验本地文件是否存在
|
|
51
|
+
* 2. 通过 multipart/form-data POST 到引态制品上传接口
|
|
52
|
+
* 3. 可选传入 sessionId,将制品与雇佣会话自动绑定
|
|
53
|
+
* 4. 解析并返回服务端响应(含下载地址等信息)
|
|
54
|
+
*
|
|
55
|
+
* 在 index.ts 中通过 api.registerTool(uploadArtifactToolFactory) 注册。
|
|
56
|
+
*/
|
|
57
|
+
export const uploadArtifactToolFactory = (_ctx) => {
|
|
58
|
+
return {
|
|
59
|
+
name: "insta_upload_artifact",
|
|
60
|
+
label: "上传制品文件到引态平台",
|
|
61
|
+
description: [
|
|
62
|
+
"当用户雇佣你的时候(远程),用户无法操作你local环境,因此你需要把你的产物通过平台传递给用户。",
|
|
63
|
+
"将本地制品文件上传到引态(Instaon)平台,并获取可访问的文件链接,可直接发送给用户。",
|
|
64
|
+
"多个文件建议先压缩为 zip 后再使用此工具上传,不要上传无关文件。",
|
|
65
|
+
"参数说明:",
|
|
66
|
+
" · filePath(必填):需要上传的本地文件绝对路径。",
|
|
67
|
+
" · sessionId(可选):当前雇佣会话的 sessionId。",
|
|
68
|
+
" 若系统提示词中包含【当前会话信息】,请将其中的 sessionId 传入,",
|
|
69
|
+
" 上传完成后文件将自动与该雇佣会话关联。",
|
|
70
|
+
"返回数据:",
|
|
71
|
+
" · upload.url 或 upload.address:文件的可访问地址。",
|
|
72
|
+
" · bind(仅传入 sessionId 时出现):会话绑定结果。",
|
|
73
|
+
].join("\n"),
|
|
74
|
+
parameters: UPLOAD_PARAMS,
|
|
75
|
+
execute: async (_toolCallId, params) => {
|
|
76
|
+
try {
|
|
77
|
+
const p = params;
|
|
78
|
+
const filePath = typeof p["filePath"] === "string" ? p["filePath"].trim() : "";
|
|
79
|
+
const sessionId = typeof p["sessionId"] === "string" ? p["sessionId"].trim() : "";
|
|
80
|
+
// ── Step 1: 参数校验 ────────────────────────────────────────────────
|
|
81
|
+
if (!filePath) {
|
|
82
|
+
const err = {
|
|
83
|
+
ok: false,
|
|
84
|
+
error: "缺少必填参数:filePath(文件绝对路径)",
|
|
85
|
+
};
|
|
86
|
+
return {
|
|
87
|
+
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
88
|
+
details: err,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (!existsSync(filePath)) {
|
|
92
|
+
const err = { ok: false, error: `文件不存在:${filePath}` };
|
|
93
|
+
return {
|
|
94
|
+
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
95
|
+
details: err,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
// ── Step 2: 读取文件,构造 multipart/form-data ─────────────────────
|
|
99
|
+
const fileBuffer = await readFile(filePath);
|
|
100
|
+
const filename = basename(filePath);
|
|
101
|
+
const blob = new Blob([fileBuffer]);
|
|
102
|
+
const formData = new FormData();
|
|
103
|
+
formData.append("file", blob, filename);
|
|
104
|
+
if (sessionId) {
|
|
105
|
+
formData.append("sessionId", sessionId);
|
|
106
|
+
}
|
|
107
|
+
// ── Step 3: 读取认证凭据 ──────────────────────────────────────────
|
|
108
|
+
const baseDir = _ctx.agentDir ?? _ctx.workspaceDir ?? process.cwd();
|
|
109
|
+
const profile = await readProfile(baseDir);
|
|
110
|
+
if (!profile?.app_key || !profile?.app_secret) {
|
|
111
|
+
const err = {
|
|
112
|
+
ok: false,
|
|
113
|
+
error: "未找到有效的 app_key / app_secret,请先完成档案注册。",
|
|
114
|
+
};
|
|
115
|
+
return {
|
|
116
|
+
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
117
|
+
details: err,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
// ── Step 4: 调用制品上传并绑定接口 ────────────────────────────────
|
|
121
|
+
const uploadUrl = getInstaUrl("artifactUploadAndBind");
|
|
122
|
+
const response = await fetch(uploadUrl, {
|
|
123
|
+
method: "POST",
|
|
124
|
+
headers: {
|
|
125
|
+
"x-app-key": profile.app_key,
|
|
126
|
+
"x-app-secret": profile.app_secret,
|
|
127
|
+
},
|
|
128
|
+
body: formData,
|
|
129
|
+
});
|
|
130
|
+
if (!response.ok) {
|
|
131
|
+
const errText = await response
|
|
132
|
+
.text()
|
|
133
|
+
.catch(() => `HTTP ${response.status}`);
|
|
134
|
+
throw new Error(`上传失败:HTTP ${response.status} ${errText}`);
|
|
135
|
+
}
|
|
136
|
+
// ── Step 5: 解析并返回响应 ─────────────────────────────────────────
|
|
137
|
+
const rawData = await response.json();
|
|
138
|
+
const result = parseUploadAndBindResponse(rawData);
|
|
139
|
+
if (result === null) {
|
|
140
|
+
// 响应结构不符合预期,原样透传,不丢失信息
|
|
141
|
+
return {
|
|
142
|
+
content: [
|
|
143
|
+
{ type: "text", text: JSON.stringify(rawData, null, 2) },
|
|
144
|
+
],
|
|
145
|
+
details: rawData,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
return {
|
|
149
|
+
content: [
|
|
150
|
+
{ type: "text", text: JSON.stringify(result, null, 2) },
|
|
151
|
+
],
|
|
152
|
+
details: result,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
catch (e) {
|
|
156
|
+
const message = e instanceof Error ? e.message : "上传过程中发生未知错误";
|
|
157
|
+
const err = { ok: false, error: message };
|
|
158
|
+
return {
|
|
159
|
+
content: [{ type: "text", text: message }],
|
|
160
|
+
details: err,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
};
|
|
166
|
+
//# sourceMappingURL=upload-artifact.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"upload-artifact.js","sourceRoot":"","sources":["../../../src/tools/upload-artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-lock.d.ts","sourceRoot":"","sources":["../../../src/utils/file-lock.ts"],"names":[],"mappings":"AAKA,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D;AAED,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBpF;AAED,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMjE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { mkdir, open, stat, unlink } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
const STALE_MS = 30_000;
|
|
4
|
+
export async function ensureDir(filePath) {
|
|
5
|
+
await mkdir(dirname(filePath), { recursive: true });
|
|
6
|
+
}
|
|
7
|
+
export async function acquireLock(baseDir, lockName) {
|
|
8
|
+
const lockPath = join(baseDir, lockName);
|
|
9
|
+
for (let i = 0; i < 100; i++) {
|
|
10
|
+
try {
|
|
11
|
+
const fd = await open(lockPath, "wx");
|
|
12
|
+
await fd.write(Buffer.from(`${process.pid}\n`));
|
|
13
|
+
await fd.close();
|
|
14
|
+
return lockPath;
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
const code = err.code;
|
|
18
|
+
if (code !== "EEXIST")
|
|
19
|
+
throw err;
|
|
20
|
+
try {
|
|
21
|
+
const s = await stat(lockPath);
|
|
22
|
+
if (Date.now() - s.mtimeMs > STALE_MS) {
|
|
23
|
+
await unlink(lockPath);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
// lock removed between checks — retry
|
|
29
|
+
}
|
|
30
|
+
await new Promise((r) => setTimeout(r, 50 + Math.random() * 50));
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
throw new Error(`Failed to acquire lock: ${lockPath}`);
|
|
34
|
+
}
|
|
35
|
+
export async function releaseLock(lockPath) {
|
|
36
|
+
try {
|
|
37
|
+
await unlink(lockPath);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// already released
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=file-lock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-lock.js","sourceRoot":"","sources":["../../../src/utils/file-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,QAAQ,GAAG,MAAM,CAAC;AAExB,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC9C,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe,EAAE,QAAgB;IACjE,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACtC,MAAM,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;YAChD,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,MAAM,IAAI,GAAI,GAA6B,CAAC,IAAI,CAAC;YACjD,IAAI,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAEjC,IAAI,CAAC;gBACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC/B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,OAAO,GAAG,QAAQ,EAAE,CAAC;oBACtC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACvB,SAAS;gBACX,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,sCAAsC;YACxC,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,mBAAmB;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type Profile = {
|
|
2
|
+
app_key: string;
|
|
3
|
+
app_secret: string;
|
|
4
|
+
name: string;
|
|
5
|
+
description: string;
|
|
6
|
+
claw_id: string;
|
|
7
|
+
hourly_rate: number;
|
|
8
|
+
enable_commissioned: boolean;
|
|
9
|
+
enable_hired: boolean;
|
|
10
|
+
scene_tags: string[];
|
|
11
|
+
custom_tags: string[];
|
|
12
|
+
avatar: string;
|
|
13
|
+
instance_type: number;
|
|
14
|
+
};
|
|
15
|
+
export declare function readProfile(baseDir: string): Promise<Profile | null>;
|
|
16
|
+
export declare function writeProfile(baseDir: string, profile: Profile): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=profile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/utils/profile.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,OAAO,GAAG;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,mBAAmB,EAAE,OAAO,CAAC;IAC7B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAIF,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAQ1E;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { acquireLock, ensureDir, releaseLock } from "./file-lock.js";
|
|
4
|
+
const PROFILE_RELATIVE_PATH = ".insta/config/profile.json";
|
|
5
|
+
export async function readProfile(baseDir) {
|
|
6
|
+
const filePath = join(baseDir, PROFILE_RELATIVE_PATH);
|
|
7
|
+
try {
|
|
8
|
+
const raw = await readFile(filePath, "utf-8");
|
|
9
|
+
return JSON.parse(raw);
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function writeProfile(baseDir, profile) {
|
|
16
|
+
const filePath = join(baseDir, PROFILE_RELATIVE_PATH);
|
|
17
|
+
await ensureDir(filePath);
|
|
18
|
+
const lockPath = await acquireLock(dirname(filePath), ".profile.lock");
|
|
19
|
+
try {
|
|
20
|
+
await writeFile(filePath, JSON.stringify(profile, null, 2), "utf-8");
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
await releaseLock(lockPath);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=profile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../src/utils/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAiBrE,MAAM,qBAAqB,GAAG,4BAA4B,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,OAAgB;IAEhB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE1B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC;IACvE,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../../src/utils/session.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAQzE;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAUf"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { acquireLock, ensureDir, releaseLock } from "./file-lock.js";
|
|
4
|
+
const SESSION_RELATIVE_PATH = ".insta/.activate_session";
|
|
5
|
+
export async function readSession(baseDir) {
|
|
6
|
+
const filePath = join(baseDir, SESSION_RELATIVE_PATH);
|
|
7
|
+
try {
|
|
8
|
+
const raw = await readFile(filePath, "utf-8");
|
|
9
|
+
return raw.trim() || null;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function writeSession(baseDir, sessionId) {
|
|
16
|
+
const filePath = join(baseDir, SESSION_RELATIVE_PATH);
|
|
17
|
+
await ensureDir(filePath);
|
|
18
|
+
const lockPath = await acquireLock(join(baseDir, ".insta"), ".session.lock");
|
|
19
|
+
try {
|
|
20
|
+
await writeFile(filePath, sessionId, "utf-8");
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
await releaseLock(lockPath);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/utils/session.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAErE,MAAM,qBAAqB,GAAG,0BAA0B,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAe;IAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,GAAG,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,OAAe,EACf,SAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IACtD,MAAM,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE1B,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE,eAAe,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@insta-dev01/insta-plugin-openclaw",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "Instagram Claw Connector - A lightweight OpenClaw channel plugin for WebSocket-based bidirectional messaging",
|
|
5
|
-
"main": "index.
|
|
6
|
-
"types": "index.ts",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
7
|
"type": "module",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"openclaw.plugin.json",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"import": "./dist/index.js"
|
|
17
|
+
}
|
|
18
|
+
},
|
|
8
19
|
"scripts": {
|
|
9
20
|
"dev": "echo 'Run: openclaw start'",
|
|
10
|
-
"build": "tsc
|
|
21
|
+
"build": "tsc -p tsconfig.build.json",
|
|
11
22
|
"test": "vitest run",
|
|
12
23
|
"test:watch": "vitest",
|
|
13
24
|
"test:coverage": "vitest run --coverage",
|
|
14
25
|
"type-check": "tsc --noEmit",
|
|
26
|
+
"prepublishOnly": "npm run build",
|
|
15
27
|
"publish:public": "npm publish --access public --registry=https://registry.npmjs.org/",
|
|
16
28
|
"tologin": "npm login --registry=https://registry.npmjs.org/"
|
|
17
29
|
},
|
|
@@ -44,7 +56,7 @@
|
|
|
44
56
|
},
|
|
45
57
|
"openclaw": {
|
|
46
58
|
"extensions": [
|
|
47
|
-
"./index.
|
|
59
|
+
"./dist/index.js"
|
|
48
60
|
],
|
|
49
61
|
"channel": {
|
|
50
62
|
"id": "insta-connector"
|