@zhin.js/service-activity-feedback 1.0.0
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 +42 -0
- package/lib/ai-event-binder.d.ts +14 -0
- package/lib/ai-event-binder.d.ts.map +1 -0
- package/lib/ai-event-binder.js +66 -0
- package/lib/ai-event-binder.js.map +1 -0
- package/lib/config.d.ts +13 -0
- package/lib/config.d.ts.map +1 -0
- package/lib/config.js +50 -0
- package/lib/config.js.map +1 -0
- package/lib/context.d.ts +21 -0
- package/lib/context.d.ts.map +1 -0
- package/lib/context.js +65 -0
- package/lib/context.js.map +1 -0
- package/lib/executor.d.ts +21 -0
- package/lib/executor.d.ts.map +1 -0
- package/lib/executor.js +122 -0
- package/lib/executor.js.map +1 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +23 -0
- package/lib/index.js.map +1 -0
- package/lib/orchestrator.d.ts +18 -0
- package/lib/orchestrator.d.ts.map +1 -0
- package/lib/orchestrator.js +50 -0
- package/lib/orchestrator.js.map +1 -0
- package/lib/policy.d.ts +18 -0
- package/lib/policy.d.ts.map +1 -0
- package/lib/policy.js +24 -0
- package/lib/policy.js.map +1 -0
- package/lib/register-binder.d.ts +7 -0
- package/lib/register-binder.d.ts.map +1 -0
- package/lib/register-binder.js +215 -0
- package/lib/register-binder.js.map +1 -0
- package/package.json +54 -0
- package/plugin.yml +2 -0
- package/src/ai-event-binder.ts +98 -0
- package/src/config.ts +75 -0
- package/src/executor.ts +166 -0
- package/src/index.ts +41 -0
- package/src/orchestrator.ts +55 -0
- package/src/policy.ts +51 -0
package/README.md
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# @zhin.js/service-activity-feedback
|
|
2
|
+
|
|
3
|
+
可选服务插件:订阅 AI 生命周期事件,按**顶层** `activityFeedback` 配置驱动各适配器能力。
|
|
4
|
+
|
|
5
|
+
## 模块结构
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
AI 事件 ──► ai-event-binder(薄) ──► ActivityFeedbackOrchestrator
|
|
9
|
+
│
|
|
10
|
+
┌────────────────────┼────────────────────┐
|
|
11
|
+
▼ ▼ ▼
|
|
12
|
+
context.ts policy.ts executor.ts
|
|
13
|
+
payload → 上下文 根级 YAML → phase 配置 platform/generic 统一执行
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- **Orchestrator**:对外 `startPhase` / `stopPhase` / `updateThinkingText`
|
|
17
|
+
- **Policy**:根级 `activityFeedback` 合并与 phase 解析
|
|
18
|
+
- **Executor**:隐藏 platform 自管 manager 与 generic manager 双路径
|
|
19
|
+
- **Adapter**:仅提供 `$activityFeedback` IO 能力
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pnpm add @zhin.js/service-activity-feedback @zhin.js/agent
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## 启用
|
|
28
|
+
|
|
29
|
+
```yaml
|
|
30
|
+
plugins:
|
|
31
|
+
- "@zhin.js/service-activity-feedback"
|
|
32
|
+
|
|
33
|
+
activityFeedback:
|
|
34
|
+
enabled: true
|
|
35
|
+
platforms:
|
|
36
|
+
icqq:
|
|
37
|
+
phases:
|
|
38
|
+
active:
|
|
39
|
+
group: { type: reaction, emoji: "60" }
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
详见 [Activity Feedback](../../../docs/advanced/activity-feedback.md)、[ADR 0034](../../../docs/adr/0034-activity-feedback-service-plugin.md)。
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { Plugin } from 'zhin.js';
|
|
2
|
+
import type { ActivityFeedbackServiceConfig } from './config.js';
|
|
3
|
+
import { type ActivityFeedbackEndpointAccess } from './executor.js';
|
|
4
|
+
import { ActivityFeedbackOrchestrator } from './orchestrator.js';
|
|
5
|
+
export declare function bindActivityFeedbackToAIEvents(root: Plugin['root'], orchestrator: ActivityFeedbackOrchestrator): () => void;
|
|
6
|
+
export declare function mountActivityFeedbackService(plugin: Plugin, orchestrator: ActivityFeedbackOrchestrator): void;
|
|
7
|
+
export interface CreateActivityFeedbackOrchestratorOptions {
|
|
8
|
+
serviceConfig: ActivityFeedbackServiceConfig;
|
|
9
|
+
access: ActivityFeedbackEndpointAccess;
|
|
10
|
+
logger: Plugin['logger'];
|
|
11
|
+
}
|
|
12
|
+
export declare function createActivityFeedbackOrchestrator(options: CreateActivityFeedbackOrchestratorOptions): ActivityFeedbackOrchestrator;
|
|
13
|
+
export declare function createActivityFeedbackOrchestratorFromPlugin(plugin: Plugin, serviceConfig: ActivityFeedbackServiceConfig): ActivityFeedbackOrchestrator;
|
|
14
|
+
//# sourceMappingURL=ai-event-binder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-event-binder.d.ts","sourceRoot":"","sources":["../src/ai-event-binder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAGL,KAAK,8BAA8B,EACpC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AAIjE,wBAAgB,8BAA8B,CAC5C,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EACpB,YAAY,EAAE,4BAA4B,GACzC,MAAM,IAAI,CA8CZ;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,4BAA4B,GACzC,IAAI,CAMN;AAED,MAAM,WAAW,yCAAyC;IACxD,aAAa,EAAE,6BAA6B,CAAC;IAC7C,MAAM,EAAE,8BAA8B,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;CAC1B;AAED,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,yCAAyC,GACjD,4BAA4B,CAI9B;AAED,wBAAgB,4CAA4C,CAC1D,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,6BAA6B,GAC3C,4BAA4B,CAM9B"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { subscribeAIEvents } from '@zhin.js/agent';
|
|
2
|
+
import { ActivityFeedbackExecutor, createRootEndpointAccess, } from './executor.js';
|
|
3
|
+
import { ActivityFeedbackOrchestrator } from './orchestrator.js';
|
|
4
|
+
import { ActivityFeedbackPolicy } from './policy.js';
|
|
5
|
+
import { loadActivityFeedbackServiceConfig } from './config.js';
|
|
6
|
+
export function bindActivityFeedbackToAIEvents(root, orchestrator) {
|
|
7
|
+
return subscribeAIEvents(root, {
|
|
8
|
+
onQueuedStart: (payload) => orchestrator.startPhase(payload, 'queued', 'activity.queued.start'),
|
|
9
|
+
onQueuedClear: (payload) => orchestrator.stopPhase(payload, 'queued', 'activity.queued.clear'),
|
|
10
|
+
onProcessingStart: async (payload) => {
|
|
11
|
+
await orchestrator.stopPhase(payload, 'queued', 'processing.start');
|
|
12
|
+
await orchestrator.startPhase(payload, 'active', 'processing.start');
|
|
13
|
+
},
|
|
14
|
+
onTypingStart: async () => { },
|
|
15
|
+
onProcessingFinish: async (payload) => {
|
|
16
|
+
if (payload.keepTyping)
|
|
17
|
+
return;
|
|
18
|
+
await orchestrator.stopPhase(payload, 'thinking', 'processing.finish');
|
|
19
|
+
await orchestrator.stopPhase(payload, 'active', 'processing.finish');
|
|
20
|
+
},
|
|
21
|
+
onProcessingError: async (payload) => {
|
|
22
|
+
await orchestrator.stopPhase(payload, 'thinking', 'processing.error');
|
|
23
|
+
await orchestrator.stopPhase(payload, 'active', 'processing.error');
|
|
24
|
+
},
|
|
25
|
+
onTypingStop: (payload) => orchestrator.stopPhase(payload, 'active', 'typing.stop'),
|
|
26
|
+
onThinking: async (payload) => {
|
|
27
|
+
if (!payload.thinking)
|
|
28
|
+
return;
|
|
29
|
+
await orchestrator.stopPhase(payload, 'active', 'thinking');
|
|
30
|
+
await orchestrator.startPhase(payload, 'thinking', 'thinking');
|
|
31
|
+
await orchestrator.updateThinkingText(payload, payload.thinking);
|
|
32
|
+
},
|
|
33
|
+
onSubagentStart: async (payload) => {
|
|
34
|
+
await orchestrator.stopPhase(payload, 'active', 'subagent.start');
|
|
35
|
+
await orchestrator.startPhase(payload, 'thinking', 'subagent.start');
|
|
36
|
+
const label = payload.label
|
|
37
|
+
? `🔍 子任务执行中: ${payload.label}...`
|
|
38
|
+
: '🔍 子 agent 处理中...';
|
|
39
|
+
await orchestrator.updateThinkingText(payload, label);
|
|
40
|
+
},
|
|
41
|
+
onSubagentFinish: async (payload) => {
|
|
42
|
+
await orchestrator.stopPhase(payload, 'thinking', 'subagent.finish');
|
|
43
|
+
await orchestrator.startPhase(payload, 'active', 'subagent.finish');
|
|
44
|
+
},
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export function mountActivityFeedbackService(plugin, orchestrator) {
|
|
48
|
+
const dispose = bindActivityFeedbackToAIEvents(plugin.root, orchestrator);
|
|
49
|
+
plugin.onDispose(() => {
|
|
50
|
+
plugin.logger.debug('[ActivityFeedback] Disposing binder');
|
|
51
|
+
dispose();
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
export function createActivityFeedbackOrchestrator(options) {
|
|
55
|
+
const policy = new ActivityFeedbackPolicy(loadActivityFeedbackServiceConfig(options.serviceConfig));
|
|
56
|
+
const executor = new ActivityFeedbackExecutor(options.access);
|
|
57
|
+
return new ActivityFeedbackOrchestrator(policy, executor, options.logger);
|
|
58
|
+
}
|
|
59
|
+
export function createActivityFeedbackOrchestratorFromPlugin(plugin, serviceConfig) {
|
|
60
|
+
return createActivityFeedbackOrchestrator({
|
|
61
|
+
serviceConfig,
|
|
62
|
+
access: createRootEndpointAccess(plugin.root),
|
|
63
|
+
logger: plugin.logger,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=ai-event-binder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-event-binder.js","sourceRoot":"","sources":["../src/ai-event-binder.ts"],"names":[],"mappings":"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"}
|
package/lib/config.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ActivityFeedbackConfig } from '@zhin.js/agent';
|
|
2
|
+
/** 顶层 `activityFeedback` 配置(zhin.config.yml,与 endpoints 解耦) */
|
|
3
|
+
export interface ActivityFeedbackServiceConfig {
|
|
4
|
+
enabled?: boolean;
|
|
5
|
+
defaults?: ActivityFeedbackConfig;
|
|
6
|
+
platforms?: Record<string, ActivityFeedbackConfig>;
|
|
7
|
+
endpoints?: Record<string, ActivityFeedbackConfig>;
|
|
8
|
+
}
|
|
9
|
+
export declare function mergeActivityFeedbackLayers(...layers: (ActivityFeedbackConfig | undefined)[]): ActivityFeedbackConfig | undefined;
|
|
10
|
+
export declare function loadActivityFeedbackServiceConfig(raw: ActivityFeedbackServiceConfig | undefined): ActivityFeedbackServiceConfig;
|
|
11
|
+
/** @deprecated 使用 ActivityFeedbackPolicy */
|
|
12
|
+
export declare function resolveActivityFeedbackForTarget(service: ActivityFeedbackServiceConfig, platform: string, endpointId: string): ActivityFeedbackConfig | undefined;
|
|
13
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7D,+DAA+D;AAC/D,MAAM,WAAW,6BAA6B;IAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,sBAAsB,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;CACpD;AAyBD,wBAAgB,2BAA2B,CACzC,GAAG,MAAM,EAAE,CAAC,sBAAsB,GAAG,SAAS,CAAC,EAAE,GAChD,sBAAsB,GAAG,SAAS,CAcpC;AAED,wBAAgB,iCAAiC,CAC/C,GAAG,EAAE,6BAA6B,GAAG,SAAS,GAC7C,6BAA6B,CAK/B;AAED,4CAA4C;AAC5C,wBAAgB,gCAAgC,CAC9C,OAAO,EAAE,6BAA6B,EACtC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,sBAAsB,GAAG,SAAS,CASpC"}
|
package/lib/config.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
function mergePhaseScene(base, override) {
|
|
2
|
+
if (!base && !override)
|
|
3
|
+
return undefined;
|
|
4
|
+
const phases = new Set([
|
|
5
|
+
...Object.keys(base ?? {}),
|
|
6
|
+
...Object.keys(override ?? {}),
|
|
7
|
+
]);
|
|
8
|
+
const merged = {};
|
|
9
|
+
for (const phase of phases) {
|
|
10
|
+
merged[phase] = {
|
|
11
|
+
...base?.[phase],
|
|
12
|
+
...override?.[phase],
|
|
13
|
+
private: { ...base?.[phase]?.private, ...override?.[phase]?.private },
|
|
14
|
+
group: { ...base?.[phase]?.group, ...override?.[phase]?.group },
|
|
15
|
+
channel: { ...base?.[phase]?.channel, ...override?.[phase]?.channel },
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
return merged;
|
|
19
|
+
}
|
|
20
|
+
export function mergeActivityFeedbackLayers(...layers) {
|
|
21
|
+
let result;
|
|
22
|
+
for (const layer of layers) {
|
|
23
|
+
if (!layer)
|
|
24
|
+
continue;
|
|
25
|
+
if (!result) {
|
|
26
|
+
result = { ...layer, phases: layer.phases ? { ...layer.phases } : undefined };
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
if (layer.enabled !== undefined)
|
|
30
|
+
result.enabled = layer.enabled;
|
|
31
|
+
if (layer.phases) {
|
|
32
|
+
result.phases = mergePhaseScene(result.phases, layer.phases);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return result;
|
|
36
|
+
}
|
|
37
|
+
export function loadActivityFeedbackServiceConfig(raw) {
|
|
38
|
+
return {
|
|
39
|
+
enabled: true,
|
|
40
|
+
...raw,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** @deprecated 使用 ActivityFeedbackPolicy */
|
|
44
|
+
export function resolveActivityFeedbackForTarget(service, platform, endpointId) {
|
|
45
|
+
if (service.enabled === false) {
|
|
46
|
+
return { enabled: false };
|
|
47
|
+
}
|
|
48
|
+
return mergeActivityFeedbackLayers(service.defaults, service.platforms?.[platform], service.endpoints?.[`${platform}:${endpointId}`]);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAUA,SAAS,eAAe,CACtB,IAAsC,EACtC,QAA0C;IAE1C,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IACzC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC;QACrB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;QAC1B,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;KAC/B,CAA6D,CAAC;IAE/D,MAAM,MAAM,GAAkD,EAAE,CAAC;IACjE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,KAAK,CAAC,GAAG;YACd,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC;YAChB,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC;YACpB,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE;YACrE,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE;YAC/D,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE;SACtE,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,GAAG,MAA8C;IAEjD,IAAI,MAA0C,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,EAAE,GAAG,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;YAC9E,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS;YAAE,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAChE,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,CAAC,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,GAA8C;IAE9C,OAAO;QACL,OAAO,EAAE,IAAI;QACb,GAAG,GAAG;KACP,CAAC;AACJ,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,gCAAgC,CAC9C,OAAsC,EACtC,QAAgB,EAChB,UAAkB;IAElB,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;QAC9B,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,2BAA2B,CAChC,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,EAC7B,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,QAAQ,IAAI,UAAU,EAAE,CAAC,CACjD,CAAC;AACJ,CAAC"}
|
package/lib/context.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { AIEventPayload, TypingIndicatorOptions } from '@zhin.js/agent';
|
|
2
|
+
export type ActivitySceneType = 'private' | 'group' | 'channel';
|
|
3
|
+
/** 单次 phase 操作的归一化上下文(由 AI 事件 payload 解析而来) */
|
|
4
|
+
export interface ActivityFeedbackContext {
|
|
5
|
+
platform: string;
|
|
6
|
+
endpointId: string;
|
|
7
|
+
sessionId: string;
|
|
8
|
+
messageId?: string;
|
|
9
|
+
sceneType: ActivitySceneType;
|
|
10
|
+
userId?: string;
|
|
11
|
+
groupId?: string;
|
|
12
|
+
options: TypingIndicatorOptions;
|
|
13
|
+
}
|
|
14
|
+
export declare function resolveSceneType(payload: AIEventPayload): ActivitySceneType;
|
|
15
|
+
export declare function resolveTargets(payload: AIEventPayload, sceneType: ActivitySceneType): {
|
|
16
|
+
userId?: string;
|
|
17
|
+
groupId?: string;
|
|
18
|
+
};
|
|
19
|
+
/** 将 AI 事件转为可执行的 activity 上下文;缺少定位信息时返回 null */
|
|
20
|
+
export declare function toActivityContext(payload: AIEventPayload): ActivityFeedbackContext | null;
|
|
21
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;AAEhE,+CAA+C;AAC/C,MAAM,WAAW,uBAAuB;IACtC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,sBAAsB,CAAC;CACjC;AAID,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,cAAc,GAAG,iBAAiB,CAO3E;AAED,wBAAgB,cAAc,CAC5B,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,iBAAiB,GAC3B;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAwBvC;AAED,gDAAgD;AAChD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,cAAc,GAAG,uBAAuB,GAAG,IAAI,CAyBzF"}
|
package/lib/context.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const SYNTHETIC_SENDER_IDS = new Set(['system', 'cron', 'assistant']);
|
|
2
|
+
export function resolveSceneType(payload) {
|
|
3
|
+
const scope = payload.scope;
|
|
4
|
+
if (scope === 'group' || scope === 'channel' || scope === 'private')
|
|
5
|
+
return scope;
|
|
6
|
+
const sceneId = payload.sceneId ?? '';
|
|
7
|
+
if (sceneId.startsWith('group:'))
|
|
8
|
+
return 'group';
|
|
9
|
+
if (sceneId.startsWith('channel:'))
|
|
10
|
+
return 'channel';
|
|
11
|
+
return 'private';
|
|
12
|
+
}
|
|
13
|
+
export function resolveTargets(payload, sceneType) {
|
|
14
|
+
const { sceneId, userId, sessionId } = payload;
|
|
15
|
+
const parts = sessionId.split(':').filter((p) => p.length > 0);
|
|
16
|
+
let resolvedUserId = userId;
|
|
17
|
+
let groupId;
|
|
18
|
+
if (sceneType === 'group' || sceneType === 'channel') {
|
|
19
|
+
groupId = sceneId?.replace(/^(group|channel):/, '') || sceneId;
|
|
20
|
+
if (!groupId && parts.length >= 3)
|
|
21
|
+
groupId = parts[1];
|
|
22
|
+
if (!resolvedUserId && parts.length >= 3)
|
|
23
|
+
resolvedUserId = parts[parts.length - 1];
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
if (sceneId?.startsWith('private:'))
|
|
27
|
+
resolvedUserId = sceneId.slice('private:'.length);
|
|
28
|
+
else if ((!resolvedUserId || SYNTHETIC_SENDER_IDS.has(resolvedUserId))
|
|
29
|
+
&& sceneId
|
|
30
|
+
&& !SYNTHETIC_SENDER_IDS.has(sceneId)) {
|
|
31
|
+
resolvedUserId = sceneId;
|
|
32
|
+
}
|
|
33
|
+
else if (!resolvedUserId && parts.length >= 2) {
|
|
34
|
+
resolvedUserId = parts.length >= 3 ? parts[parts.length - 1] : parts[1];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return { userId: resolvedUserId, groupId };
|
|
38
|
+
}
|
|
39
|
+
/** 将 AI 事件转为可执行的 activity 上下文;缺少定位信息时返回 null */
|
|
40
|
+
export function toActivityContext(payload) {
|
|
41
|
+
const { platform, endpointId, sessionId } = payload;
|
|
42
|
+
if (!platform || !endpointId)
|
|
43
|
+
return null;
|
|
44
|
+
const sceneType = resolveSceneType(payload);
|
|
45
|
+
const targets = resolveTargets(payload, sceneType);
|
|
46
|
+
return {
|
|
47
|
+
platform,
|
|
48
|
+
endpointId,
|
|
49
|
+
sessionId,
|
|
50
|
+
messageId: payload.messageId,
|
|
51
|
+
sceneType,
|
|
52
|
+
userId: targets.userId,
|
|
53
|
+
groupId: targets.groupId,
|
|
54
|
+
options: {
|
|
55
|
+
platform,
|
|
56
|
+
endpointId,
|
|
57
|
+
sessionId,
|
|
58
|
+
messageId: payload.messageId,
|
|
59
|
+
sceneType,
|
|
60
|
+
userId: targets.userId,
|
|
61
|
+
groupId: targets.groupId,
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Adapter } from 'zhin.js';
|
|
2
|
+
import { type ActivityFeedbackPhase, type EndpointWithActivityFeedback, type ResolvedActivityFeedbackPhaseConfig } from '@zhin.js/agent';
|
|
3
|
+
import type { ActivityFeedbackEventContext } from '@zhin.js/agent';
|
|
4
|
+
/** IM 侧 endpoint 访问 seam(便于测试注入 fake) */
|
|
5
|
+
export interface ActivityFeedbackEndpointAccess {
|
|
6
|
+
resolve(platform: string, endpointId: string): {
|
|
7
|
+
endpoint: EndpointWithActivityFeedback;
|
|
8
|
+
adapter: Adapter;
|
|
9
|
+
} | undefined;
|
|
10
|
+
}
|
|
11
|
+
export declare function createRootEndpointAccess(root: {
|
|
12
|
+
injectAdapter(platform: string): Adapter | undefined;
|
|
13
|
+
}): ActivityFeedbackEndpointAccess;
|
|
14
|
+
export declare class ActivityFeedbackExecutor {
|
|
15
|
+
private readonly access;
|
|
16
|
+
constructor(access: ActivityFeedbackEndpointAccess);
|
|
17
|
+
start(ctx: ActivityFeedbackEventContext, phase: ActivityFeedbackPhase, phaseConfig: ResolvedActivityFeedbackPhaseConfig): Promise<void>;
|
|
18
|
+
stop(ctx: ActivityFeedbackEventContext, phase: ActivityFeedbackPhase): Promise<void>;
|
|
19
|
+
updateThinkingText(ctx: ActivityFeedbackEventContext, text: string): Promise<void>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAIL,KAAK,qBAAqB,EAC1B,KAAK,4BAA4B,EAEjC,KAAK,mCAAmC,EACzC,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAEnE,yCAAyC;AACzC,MAAM,WAAW,8BAA8B;IAC7C,OAAO,CACL,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB;QAAE,QAAQ,EAAE,4BAA4B,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,SAAS,CAAC;CAC7E;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;CACtD,GAAG,8BAA8B,CASjC;AA2GD,qBAAa,wBAAwB;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,8BAA8B;IAE7D,KAAK,CACT,GAAG,EAAE,4BAA4B,EACjC,KAAK,EAAE,qBAAqB,EAC5B,WAAW,EAAE,mCAAmC,GAC/C,OAAO,CAAC,IAAI,CAAC;IAOV,IAAI,CAAC,GAAG,EAAE,4BAA4B,EAAE,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAOpF,kBAAkB,CAAC,GAAG,EAAE,4BAA4B,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAMzF"}
|
package/lib/executor.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { enableActivityFeedbackForBot, isGenericActivityFeedbackManager, } from '@zhin.js/agent';
|
|
2
|
+
export function createRootEndpointAccess(root) {
|
|
3
|
+
return {
|
|
4
|
+
resolve(platform, endpointId) {
|
|
5
|
+
const adapter = root.injectAdapter(platform);
|
|
6
|
+
const endpoint = adapter?.endpoints?.get(endpointId);
|
|
7
|
+
if (!endpoint || !adapter)
|
|
8
|
+
return undefined;
|
|
9
|
+
return { endpoint, adapter };
|
|
10
|
+
},
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
class PlatformPhaseDriver {
|
|
14
|
+
manager;
|
|
15
|
+
constructor(manager) {
|
|
16
|
+
this.manager = manager;
|
|
17
|
+
}
|
|
18
|
+
async start(ctx, phase, phaseConfig) {
|
|
19
|
+
const sceneType = ctx.sceneType === 'channel' ? 'group' : ctx.sceneType;
|
|
20
|
+
await this.manager.start({
|
|
21
|
+
messageId: ctx.messageId,
|
|
22
|
+
sessionId: ctx.sessionId,
|
|
23
|
+
userId: ctx.userId,
|
|
24
|
+
groupId: ctx.groupId,
|
|
25
|
+
sceneType,
|
|
26
|
+
phase,
|
|
27
|
+
phaseConfig,
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
async stop(ctx, phase) {
|
|
31
|
+
await this.manager.stop({
|
|
32
|
+
sessionId: ctx.sessionId,
|
|
33
|
+
userId: ctx.userId,
|
|
34
|
+
groupId: ctx.groupId,
|
|
35
|
+
phase,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async updateThinkingText(ctx, text) {
|
|
39
|
+
const indicator = this.manager.getActiveIndicator?.('thinking', ctx.options);
|
|
40
|
+
if (indicator?.update) {
|
|
41
|
+
await indicator.update(text);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
class GenericPhaseDriver {
|
|
46
|
+
endpoint;
|
|
47
|
+
platform;
|
|
48
|
+
adapter;
|
|
49
|
+
manager;
|
|
50
|
+
constructor(endpoint, platform, adapter) {
|
|
51
|
+
this.endpoint = endpoint;
|
|
52
|
+
this.platform = platform;
|
|
53
|
+
this.adapter = adapter;
|
|
54
|
+
}
|
|
55
|
+
async ensureManager() {
|
|
56
|
+
if (this.manager)
|
|
57
|
+
return this.manager;
|
|
58
|
+
const existing = this.endpoint.$activityFeedback;
|
|
59
|
+
if (existing && isGenericActivityFeedbackManager(existing)) {
|
|
60
|
+
this.manager = existing;
|
|
61
|
+
return existing;
|
|
62
|
+
}
|
|
63
|
+
this.manager = enableActivityFeedbackForBot(this.endpoint, this.platform, this.adapter);
|
|
64
|
+
return this.manager;
|
|
65
|
+
}
|
|
66
|
+
async start(ctx, phase, phaseConfig) {
|
|
67
|
+
const manager = await this.ensureManager();
|
|
68
|
+
if (manager.getActiveIndicator(phase, ctx.options))
|
|
69
|
+
return;
|
|
70
|
+
await manager.start(phase, ctx.options, phaseConfig);
|
|
71
|
+
}
|
|
72
|
+
async stop(ctx, phase) {
|
|
73
|
+
const manager = this.endpoint.$activityFeedback;
|
|
74
|
+
if (!manager || !isGenericActivityFeedbackManager(manager))
|
|
75
|
+
return;
|
|
76
|
+
await manager.stop(phase, ctx.options);
|
|
77
|
+
}
|
|
78
|
+
async updateThinkingText(ctx, text) {
|
|
79
|
+
const manager = this.endpoint.$activityFeedback;
|
|
80
|
+
if (!manager || !isGenericActivityFeedbackManager(manager))
|
|
81
|
+
return;
|
|
82
|
+
const indicator = manager.getActiveIndicator('thinking', ctx.options);
|
|
83
|
+
if (indicator?.update) {
|
|
84
|
+
await indicator.update(text);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function createPhaseDriver(endpoint, platform, adapter) {
|
|
89
|
+
const manager = endpoint.$activityFeedback;
|
|
90
|
+
if (manager && !isGenericActivityFeedbackManager(manager)) {
|
|
91
|
+
return new PlatformPhaseDriver(manager);
|
|
92
|
+
}
|
|
93
|
+
return new GenericPhaseDriver(endpoint, platform, adapter);
|
|
94
|
+
}
|
|
95
|
+
export class ActivityFeedbackExecutor {
|
|
96
|
+
access;
|
|
97
|
+
constructor(access) {
|
|
98
|
+
this.access = access;
|
|
99
|
+
}
|
|
100
|
+
async start(ctx, phase, phaseConfig) {
|
|
101
|
+
const resolved = this.access.resolve(ctx.platform, ctx.endpointId);
|
|
102
|
+
if (!resolved)
|
|
103
|
+
return;
|
|
104
|
+
const driver = createPhaseDriver(resolved.endpoint, ctx.platform, resolved.adapter);
|
|
105
|
+
await driver.start(ctx, phase, phaseConfig);
|
|
106
|
+
}
|
|
107
|
+
async stop(ctx, phase) {
|
|
108
|
+
const resolved = this.access.resolve(ctx.platform, ctx.endpointId);
|
|
109
|
+
if (!resolved?.endpoint.$activityFeedback)
|
|
110
|
+
return;
|
|
111
|
+
const driver = createPhaseDriver(resolved.endpoint, ctx.platform, resolved.adapter);
|
|
112
|
+
await driver.stop(ctx, phase);
|
|
113
|
+
}
|
|
114
|
+
async updateThinkingText(ctx, text) {
|
|
115
|
+
const resolved = this.access.resolve(ctx.platform, ctx.endpointId);
|
|
116
|
+
if (!resolved)
|
|
117
|
+
return;
|
|
118
|
+
const driver = createPhaseDriver(resolved.endpoint, ctx.platform, resolved.adapter);
|
|
119
|
+
await driver.updateThinkingText(ctx, text);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}
|
package/lib/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
declare const plugin: import("zhin.js").Plugin;
|
|
2
|
+
export { bindActivityFeedbackToAIEvents, createActivityFeedbackOrchestrator, createActivityFeedbackOrchestratorFromPlugin, mountActivityFeedbackService, } from './ai-event-binder.js';
|
|
3
|
+
export { ActivityFeedbackOrchestrator } from './orchestrator.js';
|
|
4
|
+
export { ActivityFeedbackPolicy } from './policy.js';
|
|
5
|
+
export { loadActivityFeedbackServiceConfig, resolveActivityFeedbackForTarget, type ActivityFeedbackServiceConfig, } from './config.js';
|
|
6
|
+
export type { ActivityFeedbackEndpointAccess } from './executor.js';
|
|
7
|
+
export default plugin;
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAUA,QAAA,MAAM,MAAM,0BAAc,CAAC;AAgB3B,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,EAClC,4CAA4C,EAC5C,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,iCAAiC,EACjC,gCAAgC,EAChC,KAAK,6BAA6B,GACnC,MAAM,aAAa,CAAC;AACrB,YAAY,EAAE,8BAA8B,EAAE,MAAM,eAAe,CAAC;AACpE,eAAe,MAAM,CAAC"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @zhin.js/service-activity-feedback
|
|
3
|
+
*/
|
|
4
|
+
import { usePlugin } from 'zhin.js';
|
|
5
|
+
import { createActivityFeedbackOrchestratorFromPlugin, mountActivityFeedbackService, } from './ai-event-binder.js';
|
|
6
|
+
import { loadActivityFeedbackServiceConfig } from './config.js';
|
|
7
|
+
const plugin = usePlugin();
|
|
8
|
+
const { root, logger } = plugin;
|
|
9
|
+
const configService = root.inject('config');
|
|
10
|
+
const appConfig = configService?.getPrimary() || {};
|
|
11
|
+
const serviceConfig = loadActivityFeedbackServiceConfig(appConfig.activityFeedback);
|
|
12
|
+
if (serviceConfig.enabled !== false) {
|
|
13
|
+
mountActivityFeedbackService(plugin, createActivityFeedbackOrchestratorFromPlugin(plugin, serviceConfig));
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
logger.info('[ActivityFeedback] disabled by activityFeedback.enabled=false');
|
|
17
|
+
}
|
|
18
|
+
export { bindActivityFeedbackToAIEvents, createActivityFeedbackOrchestrator, createActivityFeedbackOrchestratorFromPlugin, mountActivityFeedbackService, } from './ai-event-binder.js';
|
|
19
|
+
export { ActivityFeedbackOrchestrator } from './orchestrator.js';
|
|
20
|
+
export { ActivityFeedbackPolicy } from './policy.js';
|
|
21
|
+
export { loadActivityFeedbackServiceConfig, resolveActivityFeedbackForTarget, } from './config.js';
|
|
22
|
+
export default plugin;
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EACL,4CAA4C,EAC5C,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,iCAAiC,EAAsC,MAAM,aAAa,CAAC;AAEpG,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;AAC3B,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;AAEhC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC5C,MAAM,SAAS,GAAG,aAAa,EAAE,UAAU,EAAwD,IAAI,EAAE,CAAC;AAC1G,MAAM,aAAa,GAAG,iCAAiC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;AAEpF,IAAI,aAAa,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;IACpC,4BAA4B,CAC1B,MAAM,EACN,4CAA4C,CAAC,MAAM,EAAE,aAAa,CAAC,CACpE,CAAC;AACJ,CAAC;KAAM,CAAC;IACN,MAAM,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;AAC/E,CAAC;AAED,OAAO,EACL,8BAA8B,EAC9B,kCAAkC,EAClC,4CAA4C,EAC5C,4BAA4B,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,4BAA4B,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,iCAAiC,EACjC,gCAAgC,GAEjC,MAAM,aAAa,CAAC;AAErB,eAAe,MAAM,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type AIEventPayload, type ActivityFeedbackPhase } from '@zhin.js/agent';
|
|
2
|
+
import { ActivityFeedbackExecutor } from './executor.js';
|
|
3
|
+
import { ActivityFeedbackPolicy } from './policy.js';
|
|
4
|
+
type Logger = {
|
|
5
|
+
debug: (msg: string, ...args: unknown[]) => void;
|
|
6
|
+
error: (msg: string, ...args: unknown[]) => void;
|
|
7
|
+
};
|
|
8
|
+
export declare class ActivityFeedbackOrchestrator {
|
|
9
|
+
private readonly policy;
|
|
10
|
+
private readonly executor;
|
|
11
|
+
private readonly log;
|
|
12
|
+
constructor(policy: ActivityFeedbackPolicy, executor: ActivityFeedbackExecutor, log: Logger);
|
|
13
|
+
startPhase(payload: AIEventPayload, phase: ActivityFeedbackPhase, reason: string): Promise<void>;
|
|
14
|
+
stopPhase(payload: AIEventPayload, phase: ActivityFeedbackPhase, reason: string): Promise<void>;
|
|
15
|
+
updateThinkingText(payload: AIEventPayload, text: string): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,qBAAqB,EAC3B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAErD,KAAK,MAAM,GAAG;IAAE,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CAAE,CAAC;AAErH,qBAAa,4BAA4B;IAErC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,GAAG;gBAFH,MAAM,EAAE,sBAAsB,EAC9B,QAAQ,EAAE,wBAAwB,EAClC,GAAG,EAAE,MAAM;IAGxB,UAAU,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAehG,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,KAAK,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAY/F,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAU/E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { toActivityFeedbackEventContext, } from '@zhin.js/agent';
|
|
2
|
+
export class ActivityFeedbackOrchestrator {
|
|
3
|
+
policy;
|
|
4
|
+
executor;
|
|
5
|
+
log;
|
|
6
|
+
constructor(policy, executor, log) {
|
|
7
|
+
this.policy = policy;
|
|
8
|
+
this.executor = executor;
|
|
9
|
+
this.log = log;
|
|
10
|
+
}
|
|
11
|
+
async startPhase(payload, phase, reason) {
|
|
12
|
+
const ctx = toActivityFeedbackEventContext(payload);
|
|
13
|
+
if (!ctx)
|
|
14
|
+
return;
|
|
15
|
+
try {
|
|
16
|
+
const resolution = this.policy.resolvePhase(ctx.platform, ctx.endpointId, phase, ctx.sceneType);
|
|
17
|
+
if (resolution.kind !== 'active')
|
|
18
|
+
return;
|
|
19
|
+
this.log.debug(`[ActivityFeedback] start ${phase} (${reason}) session=${ctx.sessionId}`);
|
|
20
|
+
await this.executor.start(ctx, phase, resolution.config);
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
this.log.error(`[ActivityFeedback] start ${phase} failed (${reason}):`, error);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
async stopPhase(payload, phase, reason) {
|
|
27
|
+
const ctx = toActivityFeedbackEventContext(payload);
|
|
28
|
+
if (!ctx)
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
this.log.debug(`[ActivityFeedback] stop ${phase} (${reason}) session=${ctx.sessionId}`);
|
|
32
|
+
await this.executor.stop(ctx, phase);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
this.log.error(`[ActivityFeedback] stop ${phase} failed (${reason}):`, error);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
async updateThinkingText(payload, text) {
|
|
39
|
+
const ctx = toActivityFeedbackEventContext(payload);
|
|
40
|
+
if (!ctx || !text)
|
|
41
|
+
return;
|
|
42
|
+
try {
|
|
43
|
+
await this.executor.updateThinkingText(ctx, text);
|
|
44
|
+
}
|
|
45
|
+
catch (error) {
|
|
46
|
+
this.log.error('[ActivityFeedback] thinking update failed:', error);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=orchestrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../src/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,8BAA8B,GAG/B,MAAM,gBAAgB,CAAC;AAMxB,MAAM,OAAO,4BAA4B;IAEpB;IACA;IACA;IAHnB,YACmB,MAA8B,EAC9B,QAAkC,EAClC,GAAW;QAFX,WAAM,GAAN,MAAM,CAAwB;QAC9B,aAAQ,GAAR,QAAQ,CAA0B;QAClC,QAAG,GAAH,GAAG,CAAQ;IAC3B,CAAC;IAEJ,KAAK,CAAC,UAAU,CAAC,OAAuB,EAAE,KAA4B,EAAE,MAAc;QACpF,MAAM,GAAG,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;YAChG,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO;YAEzC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,KAAK,KAAK,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YACzF,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4BAA4B,KAAK,YAAY,MAAM,IAAI,EAAE,KAAK,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,OAAuB,EAAE,KAA4B,EAAE,MAAc;QACnF,MAAM,GAAG,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG;YAAE,OAAO;QAEjB,IAAI,CAAC;YACH,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,KAAK,KAAK,MAAM,aAAa,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC;YACxF,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,KAAK,YAAY,MAAM,IAAI,EAAE,KAAK,CAAC,CAAC;QAChF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,OAAuB,EAAE,IAAY;QAC5D,MAAM,GAAG,GAAG,8BAA8B,CAAC,OAAO,CAAC,CAAC;QACpD,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;YAAE,OAAO;QAE1B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,4CAA4C,EAAE,KAAK,CAAC,CAAC;QACtE,CAAC;IACH,CAAC;CACF"}
|
package/lib/policy.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ActivityFeedbackPhase, type ActivitySceneType, type ResolvedActivityFeedbackPhaseConfig } from '@zhin.js/agent';
|
|
2
|
+
import { type ActivityFeedbackServiceConfig } from './config.js';
|
|
3
|
+
export type { ActivityFeedbackServiceConfig } from './config.js';
|
|
4
|
+
export { loadActivityFeedbackServiceConfig, resolveActivityFeedbackForTarget } from './config.js';
|
|
5
|
+
export type PhaseResolution = {
|
|
6
|
+
kind: 'disabled';
|
|
7
|
+
} | {
|
|
8
|
+
kind: 'none';
|
|
9
|
+
} | {
|
|
10
|
+
kind: 'active';
|
|
11
|
+
config: ResolvedActivityFeedbackPhaseConfig;
|
|
12
|
+
};
|
|
13
|
+
export declare class ActivityFeedbackPolicy {
|
|
14
|
+
private readonly service;
|
|
15
|
+
constructor(service: ActivityFeedbackServiceConfig);
|
|
16
|
+
resolvePhase(platform: string, endpointId: string, phase: ActivityFeedbackPhase, sceneType: ActivitySceneType): PhaseResolution;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,iBAAiB,EACtB,KAAK,mCAAmC,EACzC,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,KAAK,6BAA6B,EAGnC,MAAM,aAAa,CAAC;AAErB,YAAY,EAAE,6BAA6B,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,iCAAiC,EAAE,gCAAgC,EAAE,MAAM,aAAa,CAAC;AAElG,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,mCAAmC,CAAA;CAAE,CAAC;AAEpE,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,6BAA6B;IAEnE,YAAY,CACV,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,qBAAqB,EAC5B,SAAS,EAAE,iBAAiB,GAC3B,eAAe;CAsBnB"}
|