@kafca/agentdock 0.1.36 → 0.1.38
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 +11 -0
- package/dist/renderer/assets/{Badge-DUa4J-09.js → Badge-PKJavQmQ.js} +1 -1
- package/dist/renderer/assets/{Chat-B1FWuTWV.js → Chat-DWm4h9aa.js} +1 -1
- package/dist/renderer/assets/{ChatMarkdown-DqOgFSgI.js → ChatMarkdown-DKxW2GbO.js} +1 -1
- package/dist/renderer/assets/{Config-CM5bqUrV.js → Config-Bqn3cy0z.js} +1 -1
- package/dist/renderer/assets/{CronList-CfXE7S0M.js → CronList-CPI_C7FW.js} +1 -1
- package/dist/renderer/assets/{Dashboard-D5Dwbotu.js → Dashboard-0e9JS5t7.js} +2 -2
- package/dist/renderer/assets/{EmptyState-Bs_6ISc0.js → EmptyState-CuA0koT7.js} +1 -1
- package/dist/renderer/assets/{KnowledgeDetail-0kdWnKyy.js → KnowledgeDetail-B1YSDbFa.js} +1 -1
- package/dist/renderer/assets/{KnowledgeHome-Bg8xbRe2.js → KnowledgeHome-KHYwWGDu.js} +1 -1
- package/dist/renderer/assets/{Logs-BfgvW7qZ.js → Logs-X4LJw-00.js} +1 -1
- package/dist/renderer/assets/{Modal-BkuKCDDx.js → Modal-BzEv4CK6.js} +1 -1
- package/dist/renderer/assets/{Page-ddaAS_jP.js → Page-BrZMoKtK.js} +1 -1
- package/dist/renderer/assets/{ProjectDetail-C9x-Ib5p.js → ProjectDetail-DpO00Ozx.js} +1 -1
- package/dist/renderer/assets/{ProjectList-XIIikxrj.js → ProjectList-DFtJHTic.js} +1 -1
- package/dist/renderer/assets/{Select-BBL_5aa5.js → Select-DMrwDcus.js} +1 -1
- package/dist/renderer/assets/{SessionChat-BFsTM0c7.js → SessionChat-Bh9AfkK5.js} +1 -1
- package/dist/renderer/assets/{SessionList-DWh6n10K.js → SessionList-Y3gWAe96.js} +1 -1
- package/dist/renderer/assets/{ThreadChat-CzPiDA92.js → ThreadChat-Cq0ZRNOh.js} +1 -1
- package/dist/renderer/assets/{Workspace-BW8v3Nia.js → Workspace-DMSPypFO.js} +1 -1
- package/dist/renderer/assets/{arrow-left-CcoHvwbx.js → arrow-left-CgYQZlK9.js} +1 -1
- package/dist/renderer/assets/{book-open-RweyWxPq.js → book-open-cAfg0BWS.js} +1 -1
- package/dist/renderer/assets/{check-B5YOrBNT.js → check-BNRlfwZx.js} +1 -1
- package/dist/renderer/assets/{chevron-down-HjaPrxdd.js → chevron-down-B9vVz3wf.js} +1 -1
- package/dist/renderer/assets/{circle-C-aaO7LR.js → circle-TBXQ38et.js} +1 -1
- package/dist/renderer/assets/{desktop-DUWkNnbA.js → desktop-DfkCIN1l.js} +1 -1
- package/dist/renderer/assets/{funnel-IWZmi-_V.js → funnel-BdZjZcqK.js} +1 -1
- package/dist/renderer/assets/{heart-DM5_F2nX.js → heart-CBPXb4dq.js} +1 -1
- package/dist/renderer/assets/{index-Bin2xyBS.js → index-CXrYAFUE.js} +2 -2
- package/dist/renderer/assets/{index-DvIUdsAm.js → index-C_Yr2rQ1.js} +1 -1
- package/dist/renderer/assets/{pencil-DcxwCYPi.js → pencil-BlLIWP1h.js} +1 -1
- package/dist/renderer/assets/{play-DUdnnxLC.js → play-F-oO0VwG.js} +1 -1
- package/dist/renderer/assets/{plug-B-rDbk24.js → plug-B5BduKTi.js} +1 -1
- package/dist/renderer/assets/{plus-DslMGvrO.js → plus-Bbe6vc8z.js} +1 -1
- package/dist/renderer/assets/projects-CGLECySt.js +1 -0
- package/dist/renderer/assets/{save-DlkR3jLs.js → save-CbX1ymi_.js} +1 -1
- package/dist/renderer/assets/{search-ULTp3p_0.js → search-KyB8P1Ie.js} +1 -1
- package/dist/renderer/assets/{server-DBdiKfv9.js → server-D2EQ0I-I.js} +1 -1
- package/dist/renderer/assets/{session-utils-BPyVVONo.js → session-utils-C4Eq8h8o.js} +1 -1
- package/dist/renderer/assets/{sessions-B0NecMYO.js → sessions-CchD99QT.js} +1 -1
- package/dist/renderer/assets/{shield-check-BNSk8nza.js → shield-check-BTTXqP3n.js} +1 -1
- package/dist/renderer/assets/{trash-2-CGydl763.js → trash-2-CDOrVaia.js} +1 -1
- package/dist/renderer/assets/{user-D1xkQo35.js → user-BR0zEuV_.js} +1 -1
- package/dist/renderer/assets/{wifi-off-Iy1XPeZ3.js → wifi-off-W_cPAMcl.js} +1 -1
- package/dist/renderer/index.html +1 -1
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-store.js +22 -7
- package/dist-electron/services/local-ai-core/src/acp/local-core-acp-turn-coordinator.js +2 -1
- package/dist-electron/services/local-ai-core/src/channel/lark/local-core-lark-gateway.js +59 -9
- package/dist-electron/services/local-ai-core/src/channel/lark/runtime-state.js +9 -6
- package/dist-electron/services/local-ai-core/src/channel/weixin/local-core-weixin-gateway.js +31 -1
- package/dist-electron/services/local-ai-core/src/scheduler/channel-execution-policy.js +79 -0
- package/dist-electron/services/local-ai-core/src/scheduler/lark-execution-policies.js +7 -61
- package/dist-electron/services/local-ai-core/src/scheduler/lark-schedule-adapter.js +3 -12
- package/dist-electron/services/local-ai-core/src/scheduler/local-schedule-adapter.js +23 -30
- package/dist-electron/services/local-ai-core/src/scheduler/scheduled-bridge-session.js +55 -0
- package/dist-electron/services/local-ai-core/src/scheduler/scheduler-run-lifecycle.js +13 -1
- package/dist-electron/services/local-ai-core/src/scheduler/scheduler-service.js +1 -1
- package/dist-electron/services/local-ai-core/src/scheduler/weixin-execution-policies.js +7 -61
- package/dist-electron/services/local-ai-core/src/scheduler/weixin-schedule-adapter.js +3 -12
- package/dist-electron/tests/electron/workspace-task-store.test.js +188 -28
- package/dist-electron/tests/integration/local-core-refactor.test.js +140 -50
- package/package.json +1 -1
- package/dist/renderer/assets/projects-JFuOB4DM.js +0 -1
|
@@ -1,66 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createLarkExecutionPolicy = createLarkExecutionPolicy;
|
|
4
|
+
const channel_execution_policy_js_1 = require("./channel-execution-policy.js");
|
|
4
5
|
function createLarkExecutionPolicy(job, options, resolveSameThread) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
options;
|
|
12
|
-
resolveSameThread;
|
|
13
|
-
constructor(options, resolveSameThread) {
|
|
14
|
-
this.options = options;
|
|
15
|
-
this.resolveSameThread = resolveSameThread;
|
|
16
|
-
}
|
|
17
|
-
async resolveTarget(job) {
|
|
18
|
-
return {
|
|
19
|
-
kind: 'thread',
|
|
20
|
-
threadId: await this.resolveSameThread(job),
|
|
21
|
-
workspaceId: job.workspaceId,
|
|
22
|
-
platform: job.platform,
|
|
23
|
-
route: job.route,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
beforeExecute(target) {
|
|
27
|
-
this.options.getChannelRuntime().muteThreadBridge?.(target.threadId);
|
|
28
|
-
}
|
|
29
|
-
afterExecute(target) {
|
|
30
|
-
this.options.getChannelRuntime().unmuteThreadBridge?.(target.threadId);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
class LarkSideThreadExecutionPolicy {
|
|
34
|
-
options;
|
|
35
|
-
constructor(options) {
|
|
36
|
-
this.options = options;
|
|
37
|
-
}
|
|
38
|
-
async resolveTarget(job) {
|
|
39
|
-
const title = `[Scheduled] ${job.description || job.id}`;
|
|
40
|
-
const existing = (await this.options.workspaceRouter.listThreads(job.workspaceId))
|
|
41
|
-
.find((thread) => thread.title === title);
|
|
42
|
-
if (existing) {
|
|
43
|
-
return {
|
|
44
|
-
kind: 'thread',
|
|
45
|
-
threadId: existing.id,
|
|
46
|
-
workspaceId: job.workspaceId,
|
|
47
|
-
platform: job.platform,
|
|
48
|
-
route: job.route,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
const created = await this.options.workspaceRouter.createThread(job.workspaceId, title);
|
|
52
|
-
return {
|
|
53
|
-
kind: 'thread',
|
|
54
|
-
threadId: created.id,
|
|
55
|
-
workspaceId: job.workspaceId,
|
|
56
|
-
platform: job.platform,
|
|
57
|
-
route: job.route,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
beforeExecute(target) {
|
|
61
|
-
this.options.getChannelRuntime().muteThreadBridge?.(target.threadId);
|
|
62
|
-
}
|
|
63
|
-
afterExecute(target) {
|
|
64
|
-
this.options.getChannelRuntime().unmuteThreadBridge?.(target.threadId);
|
|
65
|
-
}
|
|
6
|
+
return (0, channel_execution_policy_js_1.createChannelExecutionPolicy)(job, options, {
|
|
7
|
+
platformBase: 'lark',
|
|
8
|
+
resolveSameThread,
|
|
9
|
+
sideThreadTitle: (nextJob) => `[Scheduled:Lark] ${nextJob.description || nextJob.id}`,
|
|
10
|
+
legacySideThreadTitles: (nextJob) => [`[Scheduled] ${nextJob.description || nextJob.id}`],
|
|
11
|
+
});
|
|
66
12
|
}
|
|
@@ -26,22 +26,13 @@ class LarkScheduleAdapter {
|
|
|
26
26
|
getChannelRuntime: this.options.getChannelRuntime,
|
|
27
27
|
}, (nextJob) => this.resolveThread(nextJob));
|
|
28
28
|
const execution = await this.executor.execute(job, job.promptTemplate, executionPolicy);
|
|
29
|
-
let platformMessageId = '';
|
|
30
|
-
if (execution.replyText) {
|
|
31
|
-
const channelRuntime = this.options.getChannelRuntime();
|
|
32
|
-
if (!channelRuntime.sendScheduledMessage) {
|
|
33
|
-
throw new Error('Lark channel runtime does not support scheduled delivery.');
|
|
34
|
-
}
|
|
35
|
-
platformMessageId = await channelRuntime.sendScheduledMessage(job.workspaceId, (0, scheduled_job_route_js_1.routeWithPlatformInstance)((0, scheduled_job_route_js_1.withoutThreadRoute)(job.route), job.platform), execution.replyText);
|
|
36
|
-
if (!platformMessageId) {
|
|
37
|
-
throw new Error('Lark gateway did not return a message id for scheduled delivery.');
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
29
|
return {
|
|
41
30
|
threadId: execution.threadId,
|
|
42
31
|
runId: execution.runId,
|
|
43
32
|
replyText: execution.replyText,
|
|
44
|
-
|
|
33
|
+
deliveryMode: 'bridge-stream',
|
|
34
|
+
deliveryStatus: 'succeeded',
|
|
35
|
+
lastBridgeEventAt: new Date().toISOString(),
|
|
45
36
|
};
|
|
46
37
|
}
|
|
47
38
|
async resolveThread(job) {
|
|
@@ -1,34 +1,41 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LocalScheduleAdapter = void 0;
|
|
4
|
-
const
|
|
5
|
-
const SCHEDULED_RUN_PERMISSION_MODE = 'bypassPermissions';
|
|
4
|
+
const scheduled_conversation_executor_js_1 = require("./scheduled-conversation-executor.js");
|
|
6
5
|
class LocalScheduleAdapter {
|
|
7
6
|
options;
|
|
7
|
+
executor;
|
|
8
8
|
deliveryTargets = ['local'];
|
|
9
9
|
constructor(options) {
|
|
10
10
|
this.options = options;
|
|
11
|
+
this.executor = new scheduled_conversation_executor_js_1.ScheduledConversationExecutor({
|
|
12
|
+
store: options.store,
|
|
13
|
+
getWorkspaceRouter: options.getWorkspaceRouter,
|
|
14
|
+
});
|
|
11
15
|
}
|
|
12
16
|
supports(job) {
|
|
13
17
|
return job.platform === 'local' && (job.route.type === 'local.thread' || job.route.type === 'thread');
|
|
14
18
|
}
|
|
15
19
|
async execute(context) {
|
|
16
20
|
const { job } = context;
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
?.content;
|
|
21
|
+
const execution = await this.executor.execute(job, job.promptTemplate, this.createExecutionPolicy());
|
|
22
|
+
return {
|
|
23
|
+
threadId: execution.threadId,
|
|
24
|
+
runId: execution.runId,
|
|
25
|
+
replyText: execution.replyText,
|
|
26
|
+
deliveryMode: 'thread-only',
|
|
27
|
+
deliveryStatus: 'succeeded',
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
createExecutionPolicy() {
|
|
28
31
|
return {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
+
resolveTarget: async (job) => ({
|
|
33
|
+
kind: 'local:thread',
|
|
34
|
+
threadId: await this.resolveThread(job),
|
|
35
|
+
workspaceId: job.workspaceId,
|
|
36
|
+
platform: job.platform,
|
|
37
|
+
route: job.route,
|
|
38
|
+
}),
|
|
32
39
|
};
|
|
33
40
|
}
|
|
34
41
|
async resolveThread(job) {
|
|
@@ -54,19 +61,5 @@ class LocalScheduleAdapter {
|
|
|
54
61
|
return false;
|
|
55
62
|
}
|
|
56
63
|
}
|
|
57
|
-
async waitForRun(runId, timeoutMs = 15 * 60 * 1000) {
|
|
58
|
-
const startedAt = Date.now();
|
|
59
|
-
while (Date.now() - startedAt < timeoutMs) {
|
|
60
|
-
const run = this.options.store.getRun(runId);
|
|
61
|
-
if (run && TERMINAL_RUN_STATES.has(run.status)) {
|
|
62
|
-
if (run.status !== 'completed') {
|
|
63
|
-
throw new Error(`Scheduled run finished with status ${run.status}`);
|
|
64
|
-
}
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
await new Promise((resolve) => setTimeout(resolve, 300));
|
|
68
|
-
}
|
|
69
|
-
throw new Error(`Timed out waiting for scheduled run ${runId}`);
|
|
70
|
-
}
|
|
71
64
|
}
|
|
72
65
|
exports.LocalScheduleAdapter = LocalScheduleAdapter;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScheduledBridgeSession = void 0;
|
|
4
|
+
class ScheduledBridgeSession {
|
|
5
|
+
static async open(input) {
|
|
6
|
+
const sessionKey = input.workspaceRouter.getThreadSessionKey(input.threadId);
|
|
7
|
+
const channelRuntime = input.getChannelRuntime();
|
|
8
|
+
const unregister = await channelRuntime.registerScheduledThreadBridge?.({
|
|
9
|
+
workspaceId: input.job.workspaceId,
|
|
10
|
+
platform: input.job.platform,
|
|
11
|
+
route: input.job.route,
|
|
12
|
+
threadId: input.threadId,
|
|
13
|
+
sessionKey,
|
|
14
|
+
});
|
|
15
|
+
await sendScheduledStartNotice(channelRuntime, input.job, sessionKey);
|
|
16
|
+
return {
|
|
17
|
+
mode: 'bridge-stream',
|
|
18
|
+
workspaceId: input.job.workspaceId,
|
|
19
|
+
platform: input.job.platform,
|
|
20
|
+
route: input.job.route,
|
|
21
|
+
threadId: input.threadId,
|
|
22
|
+
sessionKey,
|
|
23
|
+
close: async () => {
|
|
24
|
+
await unregister?.();
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.ScheduledBridgeSession = ScheduledBridgeSession;
|
|
30
|
+
async function sendScheduledStartNotice(channelRuntime, job, sessionKey) {
|
|
31
|
+
if (!channelRuntime.onBridgeEvent) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
await channelRuntime.onBridgeEvent({
|
|
36
|
+
type: 'status',
|
|
37
|
+
sessionKey,
|
|
38
|
+
bridgeKind: 'status',
|
|
39
|
+
content: `⏰ ${scheduledNoticeTitle(job)}`,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// The scheduled run should continue even if the proactive start notice fails.
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
function scheduledNoticeTitle(job) {
|
|
47
|
+
const title = normalizeNoticeTitle(job.description) || normalizeNoticeTitle(job.promptTemplate) || job.id;
|
|
48
|
+
return truncateNoticeTitle(title, 80);
|
|
49
|
+
}
|
|
50
|
+
function normalizeNoticeTitle(value) {
|
|
51
|
+
return String(value || '').replace(/\s+/g, ' ').trim();
|
|
52
|
+
}
|
|
53
|
+
function truncateNoticeTitle(value, maxLength) {
|
|
54
|
+
return value.length > maxLength ? `${value.slice(0, maxLength - 1)}…` : value;
|
|
55
|
+
}
|
|
@@ -10,13 +10,18 @@ class SchedulerRunLifecycle {
|
|
|
10
10
|
const skipped = this.options.store.createScheduledJobRun(job.id, 'skipped', {
|
|
11
11
|
triggeredAt,
|
|
12
12
|
error,
|
|
13
|
+
deliveryStatus: 'skipped',
|
|
14
|
+
deliveryError: error,
|
|
13
15
|
});
|
|
14
16
|
this.options.emitRun(skipped);
|
|
15
17
|
this.emitCurrentJob(job.id);
|
|
16
18
|
return skipped;
|
|
17
19
|
}
|
|
18
20
|
markQueued(job, triggeredAt) {
|
|
19
|
-
const run = this.options.store.createScheduledJobRun(job.id, 'queued', {
|
|
21
|
+
const run = this.options.store.createScheduledJobRun(job.id, 'queued', {
|
|
22
|
+
triggeredAt,
|
|
23
|
+
deliveryStatus: 'pending',
|
|
24
|
+
});
|
|
20
25
|
this.options.emitRun(run);
|
|
21
26
|
return run;
|
|
22
27
|
}
|
|
@@ -35,6 +40,11 @@ class SchedulerRunLifecycle {
|
|
|
35
40
|
threadId: result.threadId,
|
|
36
41
|
runId: result.runId,
|
|
37
42
|
platformMessageId: result.platformMessageId,
|
|
43
|
+
platformMessageIds: result.platformMessageIds,
|
|
44
|
+
deliveryMode: result.deliveryMode,
|
|
45
|
+
deliveryStatus: result.deliveryStatus || 'succeeded',
|
|
46
|
+
deliveryError: result.deliveryError || '',
|
|
47
|
+
lastBridgeEventAt: result.lastBridgeEventAt,
|
|
38
48
|
error: '',
|
|
39
49
|
});
|
|
40
50
|
if (disableOnceJob) {
|
|
@@ -49,6 +59,8 @@ class SchedulerRunLifecycle {
|
|
|
49
59
|
status: 'failed',
|
|
50
60
|
finishedAt: new Date().toISOString(),
|
|
51
61
|
error,
|
|
62
|
+
deliveryStatus: 'failed',
|
|
63
|
+
deliveryError: error,
|
|
52
64
|
});
|
|
53
65
|
this.options.emitRun(failed);
|
|
54
66
|
this.emitCurrentJob(jobId);
|
|
@@ -1,66 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.createWeixinExecutionPolicy = createWeixinExecutionPolicy;
|
|
4
|
+
const channel_execution_policy_js_1 = require("./channel-execution-policy.js");
|
|
4
5
|
function createWeixinExecutionPolicy(job, options, resolveSameThread) {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
options;
|
|
12
|
-
resolveSameThread;
|
|
13
|
-
constructor(options, resolveSameThread) {
|
|
14
|
-
this.options = options;
|
|
15
|
-
this.resolveSameThread = resolveSameThread;
|
|
16
|
-
}
|
|
17
|
-
async resolveTarget(job) {
|
|
18
|
-
return {
|
|
19
|
-
kind: 'thread',
|
|
20
|
-
threadId: await this.resolveSameThread(job),
|
|
21
|
-
workspaceId: job.workspaceId,
|
|
22
|
-
platform: job.platform,
|
|
23
|
-
route: job.route,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
beforeExecute(target) {
|
|
27
|
-
this.options.getChannelRuntime().muteThreadBridge?.(target.threadId);
|
|
28
|
-
}
|
|
29
|
-
afterExecute(target) {
|
|
30
|
-
this.options.getChannelRuntime().unmuteThreadBridge?.(target.threadId);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
class WeixinSideThreadExecutionPolicy {
|
|
34
|
-
options;
|
|
35
|
-
constructor(options) {
|
|
36
|
-
this.options = options;
|
|
37
|
-
}
|
|
38
|
-
async resolveTarget(job) {
|
|
39
|
-
const title = `[Scheduled] ${job.description || job.id}`;
|
|
40
|
-
const existing = (await this.options.workspaceRouter.listThreads(job.workspaceId))
|
|
41
|
-
.find((thread) => thread.title === title);
|
|
42
|
-
if (existing) {
|
|
43
|
-
return {
|
|
44
|
-
kind: 'thread',
|
|
45
|
-
threadId: existing.id,
|
|
46
|
-
workspaceId: job.workspaceId,
|
|
47
|
-
platform: job.platform,
|
|
48
|
-
route: job.route,
|
|
49
|
-
};
|
|
50
|
-
}
|
|
51
|
-
const created = await this.options.workspaceRouter.createThread(job.workspaceId, title);
|
|
52
|
-
return {
|
|
53
|
-
kind: 'thread',
|
|
54
|
-
threadId: created.id,
|
|
55
|
-
workspaceId: job.workspaceId,
|
|
56
|
-
platform: job.platform,
|
|
57
|
-
route: job.route,
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
beforeExecute(target) {
|
|
61
|
-
this.options.getChannelRuntime().muteThreadBridge?.(target.threadId);
|
|
62
|
-
}
|
|
63
|
-
afterExecute(target) {
|
|
64
|
-
this.options.getChannelRuntime().unmuteThreadBridge?.(target.threadId);
|
|
65
|
-
}
|
|
6
|
+
return (0, channel_execution_policy_js_1.createChannelExecutionPolicy)(job, options, {
|
|
7
|
+
platformBase: 'weixin',
|
|
8
|
+
resolveSameThread,
|
|
9
|
+
sideThreadTitle: (nextJob) => `[Scheduled:Weixin] ${nextJob.description || nextJob.id}`,
|
|
10
|
+
legacySideThreadTitles: (nextJob) => [`[Scheduled] ${nextJob.description || nextJob.id}`],
|
|
11
|
+
});
|
|
66
12
|
}
|
|
@@ -26,22 +26,13 @@ class WeixinScheduleAdapter {
|
|
|
26
26
|
getChannelRuntime: this.options.getChannelRuntime,
|
|
27
27
|
}, (nextJob) => this.resolveThread(nextJob));
|
|
28
28
|
const execution = await this.executor.execute(job, job.promptTemplate, executionPolicy);
|
|
29
|
-
let platformMessageId = '';
|
|
30
|
-
if (execution.replyText) {
|
|
31
|
-
const channelRuntime = this.options.getChannelRuntime();
|
|
32
|
-
if (!channelRuntime.sendScheduledMessage) {
|
|
33
|
-
throw new Error('WeChat channel runtime does not support scheduled delivery.');
|
|
34
|
-
}
|
|
35
|
-
platformMessageId = await channelRuntime.sendScheduledMessage(job.workspaceId, (0, scheduled_job_route_js_1.routeWithPlatformInstance)((0, scheduled_job_route_js_1.withoutThreadRoute)(job.route), job.platform), execution.replyText);
|
|
36
|
-
if (!platformMessageId) {
|
|
37
|
-
throw new Error('WeChat gateway did not return a message id for scheduled delivery.');
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
29
|
return {
|
|
41
30
|
threadId: execution.threadId,
|
|
42
31
|
runId: execution.runId,
|
|
43
32
|
replyText: execution.replyText,
|
|
44
|
-
|
|
33
|
+
deliveryMode: 'bridge-stream',
|
|
34
|
+
deliveryStatus: 'succeeded',
|
|
35
|
+
lastBridgeEventAt: new Date().toISOString(),
|
|
45
36
|
};
|
|
46
37
|
}
|
|
47
38
|
async resolveThread(job) {
|