mirror of
https://github.com/hansjone/dsh-im-ops.git
synced 2026-10-09 05:20:46 +08:00
Add profile-scoped npm updates for Desktop and Web, protect source installations, and keep restarts manual. Cover stale status recovery, request races, and dialog focus with regression tests. Verified with npm run check (1626 tests) and isolated Desktop/Web npm installation flows. Refs #61
94 lines
3.5 KiB
JavaScript
94 lines
3.5 KiB
JavaScript
import { apply as applyDingtalk } from './channels/dingtalk/index.mjs';
|
|
import { apply as applyDiscord } from './channels/discord/index.mjs';
|
|
import { apply as applyOffice } from './channels/office/index.mjs';
|
|
import { apply as applyFeishu } from './channels/feishu/index.mjs';
|
|
import { apply as applyQq } from './channels/qq/index.mjs';
|
|
import { apply as applySlack } from './channels/slack/index.mjs';
|
|
import { apply as applyTelegram } from './channels/telegram/index.mjs';
|
|
import { apply as applyWecom } from './channels/wecom/index.mjs';
|
|
import { apply as applyWeixin } from './channels/weixin/index.mjs';
|
|
import { apply as applyWhatsapp } from './channels/whatsapp/index.mjs';
|
|
import { installOutboundArtifactTool } from '../../src/channels/shared/semantic/artifact.mjs';
|
|
import { setImHostLanguage } from '../../src/channels/shared/i18n.mjs';
|
|
import { installUpdateRpc } from './update-rpc.mjs';
|
|
|
|
export const name = 'dsh-im-host';
|
|
export const inject = [
|
|
'connection',
|
|
'credentials',
|
|
'apiProxy',
|
|
'typertGateway',
|
|
];
|
|
|
|
function channelConfig(config, name) {
|
|
const channel = config[name] ?? {};
|
|
return config.rpcAuthority === undefined
|
|
? channel
|
|
: { ...channel, rpcAuthority: config.rpcAuthority };
|
|
}
|
|
|
|
export function createImHostPlugin(internals = {}) {
|
|
const startUpdate = internals.installUpdateRpc ?? installUpdateRpc;
|
|
const startFeishu = internals.applyFeishu ?? applyFeishu;
|
|
const startWeixin = internals.applyWeixin ?? applyWeixin;
|
|
const startDingtalk = internals.applyDingtalk ?? applyDingtalk;
|
|
const startWecom = internals.applyWecom ?? applyWecom;
|
|
const startQq = internals.applyQq ?? applyQq;
|
|
const startSlack = internals.applySlack ?? applySlack;
|
|
const startTelegram = internals.applyTelegram ?? applyTelegram;
|
|
const startDiscord = internals.applyDiscord ?? applyDiscord;
|
|
const startOffice = internals.applyOffice ?? applyOffice;
|
|
const startWhatsapp = internals.applyWhatsapp ?? applyWhatsapp;
|
|
const channels = [
|
|
['feishu', startFeishu],
|
|
['weixin', startWeixin],
|
|
['dingtalk', startDingtalk],
|
|
['wecom', startWecom],
|
|
['qq', startQq],
|
|
['slack', startSlack],
|
|
['telegram', startTelegram],
|
|
['discord', startDiscord],
|
|
['whatsapp', startWhatsapp],
|
|
['office', startOffice],
|
|
];
|
|
return Object.freeze({
|
|
name,
|
|
inject,
|
|
async apply(ctx, config = {}) {
|
|
setImHostLanguage(config.language ?? process.env.DSH_IM_LANGUAGE);
|
|
if (typeof ctx?.inject === 'function') {
|
|
ctx.inject(['tools', 'systemPrompt'], (artifactCtx) => {
|
|
installOutboundArtifactTool(artifactCtx);
|
|
});
|
|
} else {
|
|
installOutboundArtifactTool(ctx);
|
|
}
|
|
const logger = typeof ctx?.logger === 'function'
|
|
? ctx.logger(name)
|
|
: (ctx?.logger ?? console);
|
|
if (ctx?.connection?.rpc) {
|
|
try {
|
|
startUpdate(ctx);
|
|
} catch (error) {
|
|
logger.error?.('[dsh-im] failed to activate update management; continuing with channels', error);
|
|
}
|
|
}
|
|
const failures = [];
|
|
for (const [channel, start] of channels) {
|
|
try {
|
|
await start(ctx, channelConfig(config, channel));
|
|
} catch (error) {
|
|
failures.push(error);
|
|
logger.error?.(`[dsh-im] failed to activate ${channel}; continuing with the remaining channels`, error);
|
|
}
|
|
}
|
|
if (failures.length === channels.length) {
|
|
throw new AggregateError(failures, 'dsh-im failed to activate every channel');
|
|
}
|
|
},
|
|
});
|
|
}
|
|
|
|
export async function apply(ctx, config = {}) {
|
|
return createImHostPlugin().apply(ctx, config);
|
|
}
|