@insta-dev01/insta-plugin-openclaw 1.0.2 → 1.0.4
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.map +1 -1
- package/dist/index.js +37 -16
- package/dist/index.js.map +1 -1
- package/dist/src/channel/dispatcher.d.ts.map +1 -1
- package/dist/src/channel/dispatcher.js +20 -0
- package/dist/src/channel/dispatcher.js.map +1 -1
- package/dist/src/channel/registration-store.d.ts.map +1 -1
- package/dist/src/channel/registration-store.js +7 -0
- package/dist/src/channel/registration-store.js.map +1 -1
- package/dist/src/core/register-identity.d.ts.map +1 -1
- package/dist/src/core/register-identity.js +26 -1
- package/dist/src/core/register-identity.js.map +1 -1
- package/dist/src/core/task-api.d.ts.map +1 -1
- package/dist/src/core/task-api.js +32 -3
- package/dist/src/core/task-api.js.map +1 -1
- package/dist/src/tools/get-plugin-profile.d.ts.map +1 -1
- package/dist/src/tools/get-plugin-profile.js +11 -9
- package/dist/src/tools/get-plugin-profile.js.map +1 -1
- package/dist/src/tools/grab-task.d.ts.map +1 -1
- package/dist/src/tools/grab-task.js +16 -15
- package/dist/src/tools/grab-task.js.map +1 -1
- package/dist/src/tools/list-tasks.d.ts.map +1 -1
- package/dist/src/tools/list-tasks.js +13 -15
- package/dist/src/tools/list-tasks.js.map +1 -1
- package/dist/src/tools/propose-registration.d.ts.map +1 -1
- package/dist/src/tools/propose-registration.js +23 -38
- package/dist/src/tools/propose-registration.js.map +1 -1
- package/dist/src/tools/register-identity.d.ts.map +1 -1
- package/dist/src/tools/register-identity.js +24 -38
- package/dist/src/tools/register-identity.js.map +1 -1
- package/dist/src/tools/submit-deliverable.d.ts.map +1 -1
- package/dist/src/tools/submit-deliverable.js +47 -37
- package/dist/src/tools/submit-deliverable.js.map +1 -1
- package/dist/src/tools/upload-artifact.d.ts.map +1 -1
- package/dist/src/tools/upload-artifact.js +25 -24
- package/dist/src/tools/upload-artifact.js.map +1 -1
- package/dist/src/utils/profile.d.ts.map +1 -1
- package/dist/src/utils/profile.js +20 -2
- package/dist/src/utils/profile.js.map +1 -1
- package/openclaw.plugin.json +15 -4
- package/package.json +6 -3
|
@@ -3,34 +3,30 @@ import { readdir, stat, readFile } from "node:fs/promises";
|
|
|
3
3
|
import { basename, join } from "node:path";
|
|
4
4
|
import { tmpdir } from "node:os";
|
|
5
5
|
import { randomBytes } from "node:crypto";
|
|
6
|
-
import
|
|
6
|
+
import { ZipArchive } from "archiver";
|
|
7
|
+
import { Type } from "typebox";
|
|
7
8
|
import { taskApiPostMultipart } from "../core/task-api.js";
|
|
9
|
+
import { DebugLogger } from "../channel/logger.js";
|
|
10
|
+
import { DEBUG_ENABLED } from "../channel/config.js";
|
|
11
|
+
const log = new DebugLogger(DEBUG_ENABLED, "[InstaPlugin:tool:submit_deliverable]");
|
|
8
12
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
9
13
|
// 工具参数 JSON Schema
|
|
10
14
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
11
|
-
const SUBMIT_DELIVERABLE_PARAMS = {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
description: "任务执行结果描述/报告(必填文字说明)。" +
|
|
27
|
-
"请用简洁语言描述本次任务的执行结论、关键产出和注意事项," +
|
|
28
|
-
"此文本将与产物文件一并提交给任务发布方。",
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
required: ["task_id", "artifact_path", "result_description"],
|
|
32
|
-
additionalProperties: false,
|
|
33
|
-
};
|
|
15
|
+
const SUBMIT_DELIVERABLE_PARAMS = Type.Object({
|
|
16
|
+
task_id: Type.String({
|
|
17
|
+
description: "已认领任务的 UUID(通过 insta_grab_task 抢单成功后获得)",
|
|
18
|
+
}),
|
|
19
|
+
artifact_path: Type.String({
|
|
20
|
+
description: "产物路径(绝对路径)。" +
|
|
21
|
+
"若为目录,将自动递归打包成 ZIP 后提交;" +
|
|
22
|
+
"若为文件(含 .zip),直接上传,无需额外打包。",
|
|
23
|
+
}),
|
|
24
|
+
result_description: Type.String({
|
|
25
|
+
description: "任务执行结果描述/报告(必填文字说明)。" +
|
|
26
|
+
"请用简洁语言描述本次任务的执行结论、关键产出和注意事项," +
|
|
27
|
+
"此文本将与产物文件一并提交给任务发布方。",
|
|
28
|
+
}),
|
|
29
|
+
});
|
|
34
30
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
35
31
|
// 内部工具:将目录打包为 ZIP(写入临时文件)
|
|
36
32
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
@@ -46,7 +42,7 @@ async function packDirectoryToZip(dirPath) {
|
|
|
46
42
|
const zipPath = join(tmpdir(), zipName);
|
|
47
43
|
await new Promise((resolve, reject) => {
|
|
48
44
|
const output = createWriteStream(zipPath);
|
|
49
|
-
const archive =
|
|
45
|
+
const archive = new ZipArchive({ zlib: { level: 6 } });
|
|
50
46
|
output.on("close", resolve);
|
|
51
47
|
archive.on("error", reject);
|
|
52
48
|
archive.pipe(output);
|
|
@@ -102,8 +98,16 @@ export const submitDeliverableToolFactory = (ctx) => {
|
|
|
102
98
|
const resultDescription = typeof p["result_description"] === "string"
|
|
103
99
|
? p["result_description"].trim()
|
|
104
100
|
: "";
|
|
105
|
-
|
|
101
|
+
const baseDir = ctx.agentDir ?? ctx.workspaceDir ?? process.cwd();
|
|
102
|
+
log.info("execute ENTER", {
|
|
103
|
+
toolCallId: _toolCallId,
|
|
104
|
+
task_id: taskId,
|
|
105
|
+
artifact_path: artifactPath,
|
|
106
|
+
description_length: resultDescription.length,
|
|
107
|
+
baseDir,
|
|
108
|
+
});
|
|
106
109
|
if (!taskId) {
|
|
110
|
+
log.warn("execute missing task_id");
|
|
107
111
|
const err = { ok: false, error: "缺少必填参数:task_id(任务 UUID)" };
|
|
108
112
|
return {
|
|
109
113
|
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
@@ -111,6 +115,7 @@ export const submitDeliverableToolFactory = (ctx) => {
|
|
|
111
115
|
};
|
|
112
116
|
}
|
|
113
117
|
if (!artifactPath) {
|
|
118
|
+
log.warn("execute missing artifact_path");
|
|
114
119
|
const err = { ok: false, error: "缺少必填参数:artifact_path(产物路径)" };
|
|
115
120
|
return {
|
|
116
121
|
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
@@ -118,6 +123,7 @@ export const submitDeliverableToolFactory = (ctx) => {
|
|
|
118
123
|
};
|
|
119
124
|
}
|
|
120
125
|
if (!resultDescription) {
|
|
126
|
+
log.warn("execute missing result_description");
|
|
121
127
|
const err = {
|
|
122
128
|
ok: false,
|
|
123
129
|
error: "缺少必填参数:result_description(任务执行结果描述)",
|
|
@@ -128,46 +134,49 @@ export const submitDeliverableToolFactory = (ctx) => {
|
|
|
128
134
|
};
|
|
129
135
|
}
|
|
130
136
|
if (!existsSync(artifactPath)) {
|
|
137
|
+
log.warn("execute artifact path not found", { artifactPath });
|
|
131
138
|
const err = { ok: false, error: `产物路径不存在:${artifactPath}` };
|
|
132
139
|
return {
|
|
133
140
|
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
134
141
|
details: err,
|
|
135
142
|
};
|
|
136
143
|
}
|
|
137
|
-
// ── Step 2: 判断路径类型,必要时打包 ZIP ─────────────────────────────
|
|
138
144
|
const pathStat = await stat(artifactPath);
|
|
139
145
|
let uploadFilePath;
|
|
140
146
|
let packed = false;
|
|
141
147
|
if (pathStat.isDirectory()) {
|
|
142
|
-
// 目录 → 先检查是否为空目录
|
|
143
148
|
const entries = await readdir(artifactPath);
|
|
149
|
+
log.info("execute artifact is directory", { artifactPath, entry_count: entries.length });
|
|
144
150
|
if (entries.length === 0) {
|
|
151
|
+
log.warn("execute empty directory", { artifactPath });
|
|
145
152
|
const err = { ok: false, error: `产物目录为空,无法提交:${artifactPath}` };
|
|
146
153
|
return {
|
|
147
154
|
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
148
155
|
details: err,
|
|
149
156
|
};
|
|
150
157
|
}
|
|
151
|
-
|
|
158
|
+
log.info("execute packing directory to zip", { artifactPath });
|
|
152
159
|
tempZipPath = await packDirectoryToZip(artifactPath);
|
|
153
160
|
uploadFilePath = tempZipPath;
|
|
154
161
|
packed = true;
|
|
162
|
+
log.info("execute zip created", { tempZipPath });
|
|
155
163
|
}
|
|
156
164
|
else {
|
|
157
|
-
|
|
165
|
+
log.info("execute artifact is file", { artifactPath, size: pathStat.size });
|
|
158
166
|
uploadFilePath = artifactPath;
|
|
159
167
|
}
|
|
160
|
-
// ── Step 3: 读取文件,构造 multipart/form-data ────────────────────────
|
|
161
168
|
const fileBuffer = await readFile(uploadFilePath);
|
|
162
169
|
const filename = basename(uploadFilePath);
|
|
170
|
+
log.info("execute file read", { filename, bytes: fileBuffer.length, packed });
|
|
163
171
|
const blob = new Blob([fileBuffer], { type: "application/zip" });
|
|
164
172
|
const formData = new FormData();
|
|
165
173
|
formData.append("result_description", resultDescription);
|
|
166
174
|
formData.append("zip_file", blob, filename);
|
|
167
|
-
|
|
168
|
-
const baseDir = ctx.agentDir ?? ctx.workspaceDir ?? process.cwd();
|
|
175
|
+
log.info("execute POST deliverable →", { task_id: taskId, filename });
|
|
169
176
|
const resp = await taskApiPostMultipart(baseDir, `/bots/tasks/${taskId}/deliverable`, formData);
|
|
177
|
+
log.info("execute POST deliverable ←", { code: resp.code, message: resp.message });
|
|
170
178
|
if (resp.code !== 0) {
|
|
179
|
+
log.warn("execute business error", { code: resp.code, message: resp.message });
|
|
171
180
|
const err = {
|
|
172
181
|
ok: false,
|
|
173
182
|
code: resp.code,
|
|
@@ -178,7 +187,6 @@ export const submitDeliverableToolFactory = (ctx) => {
|
|
|
178
187
|
details: err,
|
|
179
188
|
};
|
|
180
189
|
}
|
|
181
|
-
// ── Step 5: 返回成功结果 ──────────────────────────────────────────────
|
|
182
190
|
const result = {
|
|
183
191
|
ok: true,
|
|
184
192
|
task_id: taskId,
|
|
@@ -187,6 +195,7 @@ export const submitDeliverableToolFactory = (ctx) => {
|
|
|
187
195
|
data: resp.data ?? {},
|
|
188
196
|
message: "产物提交成功,任务状态已自动流转为「已完成」",
|
|
189
197
|
};
|
|
198
|
+
log.info("execute DONE", { task_id: taskId, filename });
|
|
190
199
|
return {
|
|
191
200
|
content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
|
|
192
201
|
details: result,
|
|
@@ -194,6 +203,7 @@ export const submitDeliverableToolFactory = (ctx) => {
|
|
|
194
203
|
}
|
|
195
204
|
catch (e) {
|
|
196
205
|
const message = e instanceof Error ? e.message : "提交产物过程中发生未知错误";
|
|
206
|
+
log.error("execute exception", e instanceof Error ? e : undefined);
|
|
197
207
|
const err = { ok: false, error: message };
|
|
198
208
|
return {
|
|
199
209
|
content: [{ type: "text", text: message }],
|
|
@@ -201,12 +211,12 @@ export const submitDeliverableToolFactory = (ctx) => {
|
|
|
201
211
|
};
|
|
202
212
|
}
|
|
203
213
|
finally {
|
|
204
|
-
// ── 清理临时 ZIP 文件 ─────────────────────────────────────────────────
|
|
205
214
|
if (tempZipPath) {
|
|
206
215
|
const { unlink } = await import("node:fs/promises");
|
|
207
|
-
await unlink(tempZipPath).catch(() => {
|
|
208
|
-
|
|
216
|
+
await unlink(tempZipPath).catch((e) => {
|
|
217
|
+
log.warn("execute failed to cleanup temp zip", { tempZipPath, error: e.message });
|
|
209
218
|
});
|
|
219
|
+
log.debug("execute temp zip cleaned up", { tempZipPath });
|
|
210
220
|
}
|
|
211
221
|
}
|
|
212
222
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"submit-deliverable.js","sourceRoot":"","sources":["../../../src/tools/submit-deliverable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"submit-deliverable.js","sourceRoot":"","sources":["../../../src/tools/submit-deliverable.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-artifact.d.ts","sourceRoot":"","sources":["../../../src/tools/upload-artifact.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"upload-artifact.d.ts","sourceRoot":"","sources":["../../../src/tools/upload-artifact.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,kCAAkC,CAAC;AA6E1C;;;;;;;;;;GAUG;AACH,eAAO,MAAM,yBAAyB,EAAE,yBAoIvC,CAAC"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { readFile } from "node:fs/promises";
|
|
3
3
|
import { basename } from "node:path";
|
|
4
|
+
import { Type } from "typebox";
|
|
4
5
|
import { getInstaUrl } from "../core/urls.js";
|
|
5
6
|
import { readProfile } from "../utils/profile.js";
|
|
7
|
+
import { DebugLogger } from "../channel/logger.js";
|
|
8
|
+
import { DEBUG_ENABLED } from "../channel/config.js";
|
|
9
|
+
const log = new DebugLogger(DEBUG_ENABLED, "[InstaPlugin:tool:upload_artifact]");
|
|
6
10
|
/**
|
|
7
11
|
* 将服务端原始响应解析为强类型结构。
|
|
8
12
|
* 若必填字段缺失则返回 null,由调用方透传原始数据。
|
|
@@ -23,23 +27,14 @@ function parseUploadAndBindResponse(raw) {
|
|
|
23
27
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
24
28
|
// 工具参数 JSON Schema
|
|
25
29
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
26
|
-
const UPLOAD_PARAMS = {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
type: "string",
|
|
35
|
-
description: "当前雇佣会话的 sessionId。处于用户雇佣会话时必须传入," +
|
|
36
|
-
"上传完成后会自动将文件与该会话关联。" +
|
|
37
|
-
"如果系统提示词中包含【当前会话信息】,请将其中的 sessionId 值传入此参数。",
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
required: ["filePath"],
|
|
41
|
-
additionalProperties: false,
|
|
42
|
-
};
|
|
30
|
+
const UPLOAD_PARAMS = Type.Object({
|
|
31
|
+
filePath: Type.String({ description: "需要上传的本地文件的绝对路径" }),
|
|
32
|
+
sessionId: Type.Optional(Type.String({
|
|
33
|
+
description: "当前雇佣会话的 sessionId。处于用户雇佣会话时必须传入," +
|
|
34
|
+
"上传完成后会自动将文件与该会话关联。" +
|
|
35
|
+
"如果系统提示词中包含【当前会话信息】,请将其中的 sessionId 值传入此参数。",
|
|
36
|
+
})),
|
|
37
|
+
});
|
|
43
38
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
44
39
|
// 工具:insta_upload_artifact
|
|
45
40
|
// ──────────────────────────────────────────────────────────────────────────────
|
|
@@ -77,8 +72,10 @@ export const uploadArtifactToolFactory = (_ctx) => {
|
|
|
77
72
|
const p = params;
|
|
78
73
|
const filePath = typeof p["filePath"] === "string" ? p["filePath"].trim() : "";
|
|
79
74
|
const sessionId = typeof p["sessionId"] === "string" ? p["sessionId"].trim() : "";
|
|
80
|
-
|
|
75
|
+
const baseDir = _ctx.agentDir ?? _ctx.workspaceDir ?? process.cwd();
|
|
76
|
+
log.info("execute ENTER", { toolCallId: _toolCallId, filePath, sessionId: sessionId || "(none)", baseDir });
|
|
81
77
|
if (!filePath) {
|
|
78
|
+
log.warn("execute missing filePath");
|
|
82
79
|
const err = {
|
|
83
80
|
ok: false,
|
|
84
81
|
error: "缺少必填参数:filePath(文件绝对路径)",
|
|
@@ -89,25 +86,25 @@ export const uploadArtifactToolFactory = (_ctx) => {
|
|
|
89
86
|
};
|
|
90
87
|
}
|
|
91
88
|
if (!existsSync(filePath)) {
|
|
89
|
+
log.warn("execute file not found", { filePath });
|
|
92
90
|
const err = { ok: false, error: `文件不存在:${filePath}` };
|
|
93
91
|
return {
|
|
94
92
|
content: [{ type: "text", text: JSON.stringify(err) }],
|
|
95
93
|
details: err,
|
|
96
94
|
};
|
|
97
95
|
}
|
|
98
|
-
// ── Step 2: 读取文件,构造 multipart/form-data ─────────────────────
|
|
99
96
|
const fileBuffer = await readFile(filePath);
|
|
100
97
|
const filename = basename(filePath);
|
|
98
|
+
log.info("execute file read", { filename, bytes: fileBuffer.length });
|
|
101
99
|
const blob = new Blob([fileBuffer]);
|
|
102
100
|
const formData = new FormData();
|
|
103
101
|
formData.append("file", blob, filename);
|
|
104
102
|
if (sessionId) {
|
|
105
103
|
formData.append("sessionId", sessionId);
|
|
106
104
|
}
|
|
107
|
-
// ── Step 3: 读取认证凭据 ──────────────────────────────────────────
|
|
108
|
-
const baseDir = _ctx.agentDir ?? _ctx.workspaceDir ?? process.cwd();
|
|
109
105
|
const profile = await readProfile(baseDir);
|
|
110
106
|
if (!profile?.app_key || !profile?.app_secret) {
|
|
107
|
+
log.warn("execute missing credentials", { has_key: !!profile?.app_key, has_secret: !!profile?.app_secret });
|
|
111
108
|
const err = {
|
|
112
109
|
ok: false,
|
|
113
110
|
error: "未找到有效的 app_key / app_secret,请先完成档案注册。",
|
|
@@ -117,8 +114,8 @@ export const uploadArtifactToolFactory = (_ctx) => {
|
|
|
117
114
|
details: err,
|
|
118
115
|
};
|
|
119
116
|
}
|
|
120
|
-
// ── Step 4: 调用制品上传并绑定接口 ────────────────────────────────
|
|
121
117
|
const uploadUrl = getInstaUrl("artifactUploadAndBind");
|
|
118
|
+
log.info("execute upload POST →", { uploadUrl, filename });
|
|
122
119
|
const response = await fetch(uploadUrl, {
|
|
123
120
|
method: "POST",
|
|
124
121
|
headers: {
|
|
@@ -127,17 +124,19 @@ export const uploadArtifactToolFactory = (_ctx) => {
|
|
|
127
124
|
},
|
|
128
125
|
body: formData,
|
|
129
126
|
});
|
|
127
|
+
log.info("execute upload POST ←", { status: response.status, ok: response.ok });
|
|
130
128
|
if (!response.ok) {
|
|
131
129
|
const errText = await response
|
|
132
130
|
.text()
|
|
133
131
|
.catch(() => `HTTP ${response.status}`);
|
|
132
|
+
log.error("execute HTTP error", undefined, { status: response.status, body: errText.slice(0, 200) });
|
|
134
133
|
throw new Error(`上传失败:HTTP ${response.status} ${errText}`);
|
|
135
134
|
}
|
|
136
|
-
// ── Step 5: 解析并返回响应 ─────────────────────────────────────────
|
|
137
135
|
const rawData = await response.json();
|
|
136
|
+
log.debug("execute response body", { rawData });
|
|
138
137
|
const result = parseUploadAndBindResponse(rawData);
|
|
139
138
|
if (result === null) {
|
|
140
|
-
|
|
139
|
+
log.warn("execute unexpected response shape", { rawData });
|
|
141
140
|
return {
|
|
142
141
|
content: [
|
|
143
142
|
{ type: "text", text: JSON.stringify(rawData, null, 2) },
|
|
@@ -145,6 +144,7 @@ export const uploadArtifactToolFactory = (_ctx) => {
|
|
|
145
144
|
details: rawData,
|
|
146
145
|
};
|
|
147
146
|
}
|
|
147
|
+
log.info("execute DONE", { upload_url: result.upload.url ?? result.upload.address });
|
|
148
148
|
return {
|
|
149
149
|
content: [
|
|
150
150
|
{ type: "text", text: JSON.stringify(result, null, 2) },
|
|
@@ -154,6 +154,7 @@ export const uploadArtifactToolFactory = (_ctx) => {
|
|
|
154
154
|
}
|
|
155
155
|
catch (e) {
|
|
156
156
|
const message = e instanceof Error ? e.message : "上传过程中发生未知错误";
|
|
157
|
+
log.error("execute exception", e instanceof Error ? e : undefined);
|
|
157
158
|
const err = { ok: false, error: message };
|
|
158
159
|
return {
|
|
159
160
|
content: [{ type: "text", text: message }],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upload-artifact.js","sourceRoot":"","sources":["../../../src/tools/upload-artifact.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"upload-artifact.js","sourceRoot":"","sources":["../../../src/tools/upload-artifact.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/utils/profile.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"profile.d.ts","sourceRoot":"","sources":["../../../src/utils/profile.ts"],"names":[],"mappings":"AAQA,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,CAiB1E;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,IAAI,CAAC,CAgBf"}
|
|
@@ -1,23 +1,41 @@
|
|
|
1
1
|
import { readFile, writeFile } from "node:fs/promises";
|
|
2
2
|
import { dirname, join } from "node:path";
|
|
3
3
|
import { acquireLock, ensureDir, releaseLock } from "./file-lock.js";
|
|
4
|
+
import { DebugLogger } from "../channel/logger.js";
|
|
5
|
+
import { DEBUG_ENABLED } from "../channel/config.js";
|
|
6
|
+
const log = new DebugLogger(DEBUG_ENABLED, "[InstaPlugin:profile]");
|
|
4
7
|
const PROFILE_RELATIVE_PATH = ".insta/config/profile.json";
|
|
5
8
|
export async function readProfile(baseDir) {
|
|
6
9
|
const filePath = join(baseDir, PROFILE_RELATIVE_PATH);
|
|
10
|
+
log.debug("readProfile", { filePath });
|
|
7
11
|
try {
|
|
8
12
|
const raw = await readFile(filePath, "utf-8");
|
|
9
|
-
|
|
13
|
+
const profile = JSON.parse(raw);
|
|
14
|
+
log.debug("readProfile OK", {
|
|
15
|
+
filePath,
|
|
16
|
+
app_key: profile.app_key ? profile.app_key.slice(0, 8) + "…" : "(empty)",
|
|
17
|
+
claw_id: profile.claw_id ?? "(none)",
|
|
18
|
+
has_secret: !!profile.app_secret,
|
|
19
|
+
});
|
|
20
|
+
return profile;
|
|
10
21
|
}
|
|
11
|
-
catch {
|
|
22
|
+
catch (err) {
|
|
23
|
+
log.debug("readProfile miss", { filePath, reason: err.code ?? String(err) });
|
|
12
24
|
return null;
|
|
13
25
|
}
|
|
14
26
|
}
|
|
15
27
|
export async function writeProfile(baseDir, profile) {
|
|
16
28
|
const filePath = join(baseDir, PROFILE_RELATIVE_PATH);
|
|
29
|
+
log.info("writeProfile START", {
|
|
30
|
+
filePath,
|
|
31
|
+
app_key: profile.app_key ? profile.app_key.slice(0, 8) + "…" : "(empty)",
|
|
32
|
+
claw_id: profile.claw_id ?? "(none)",
|
|
33
|
+
});
|
|
17
34
|
await ensureDir(filePath);
|
|
18
35
|
const lockPath = await acquireLock(dirname(filePath), ".profile.lock");
|
|
19
36
|
try {
|
|
20
37
|
await writeFile(filePath, JSON.stringify(profile, null, 2), "utf-8");
|
|
38
|
+
log.info("writeProfile OK", { filePath });
|
|
21
39
|
}
|
|
22
40
|
finally {
|
|
23
41
|
await releaseLock(lockPath);
|
|
@@ -1 +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;
|
|
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;AACrE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,GAAG,GAAG,IAAI,WAAW,CAAC,aAAa,EAAE,uBAAuB,CAAC,CAAC;AAiBpE,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,GAAG,CAAC,KAAK,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC;QAC3C,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE;YAC1B,QAAQ;YACR,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS;YACxE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,QAAQ;YACpC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU;SACjC,CAAC,CAAC;QACH,OAAO,OAAO,CAAC;IACjB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,GAAG,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAG,GAA6B,CAAC,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACxG,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,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE;QAC7B,QAAQ;QACR,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,SAAS;QACxE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,QAAQ;KACrC,CAAC,CAAC;IACH,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;QACrE,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,11 +1,22 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "insta-plugin-openclaw",
|
|
3
|
-
"channels": [
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
"channels": ["insta-connector"],
|
|
4
|
+
"contracts": {
|
|
5
|
+
"tools": true,
|
|
6
|
+
"channel": true
|
|
7
|
+
},
|
|
6
8
|
"configSchema": {
|
|
7
9
|
"type": "object",
|
|
8
10
|
"additionalProperties": false,
|
|
9
|
-
"properties": {
|
|
11
|
+
"properties": {
|
|
12
|
+
"enabled": {
|
|
13
|
+
"type": "boolean",
|
|
14
|
+
"default": true
|
|
15
|
+
},
|
|
16
|
+
"systemPrompt": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "System prompt for the InstaClaw connector"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
10
21
|
}
|
|
11
22
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@insta-dev01/insta-plugin-openclaw",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
4
4
|
"description": "Instagram Claw Connector - A lightweight OpenClaw channel plugin for WebSocket-based bidirectional messaging",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -42,15 +42,18 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"archiver": "^8.0.0",
|
|
45
|
-
"
|
|
45
|
+
"typebox": "1.1.39",
|
|
46
46
|
"ws": "^8.20.1"
|
|
47
47
|
},
|
|
48
|
+
"peerDependencies": {
|
|
49
|
+
"openclaw": ">=2026.5.20"
|
|
50
|
+
},
|
|
48
51
|
"devDependencies": {
|
|
49
|
-
"@types/archiver": "^7.0.0",
|
|
50
52
|
"@types/node": "^20.19.37",
|
|
51
53
|
"@types/ws": "^8.18.1",
|
|
52
54
|
"@vitest/coverage-v8": "^2.0.0",
|
|
53
55
|
"@vitest/ui": "^2.1.9",
|
|
56
|
+
"openclaw": "^2026.6.1",
|
|
54
57
|
"typescript": "^5.6.0",
|
|
55
58
|
"vitest": "^2.1.9"
|
|
56
59
|
},
|