shennian 0.3.86 → 0.4.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 +3 -2
- package/dist/bin/shennian.js +1 -1
- package/dist/publish-build-manifest.json +32 -27
- package/dist/src/agents/adapter.js +1 -19
- package/dist/src/agents/claude-managed-permissions.js +1 -248
- package/dist/src/agents/claude.js +8 -393
- package/dist/src/agents/codex-managed-permissions.js +1 -294
- package/dist/src/agents/codex-managed-room-tools.js +1 -249
- package/dist/src/agents/codex-utils.js +7 -200
- package/dist/src/agents/codex.d.ts +7 -1
- package/dist/src/agents/codex.js +17 -1352
- package/dist/src/agents/config-status.js +1 -226
- package/dist/src/agents/cursor-managed-permissions.js +2 -299
- package/dist/src/agents/cursor.js +1 -314
- package/dist/src/agents/custom.js +4 -418
- package/dist/src/agents/external-channel-instructions.js +11 -94
- package/dist/src/agents/gemini.js +1 -180
- package/dist/src/agents/manager.js +18 -250
- package/dist/src/agents/model-registry/cache.js +1 -37
- package/dist/src/agents/model-registry/discovery.js +2 -188
- package/dist/src/agents/model-registry/parsers.js +4 -521
- package/dist/src/agents/model-registry/runner.js +1 -30
- package/dist/src/agents/model-registry/service.js +1 -115
- package/dist/src/agents/model-registry/types.js +1 -8
- package/dist/src/agents/model-registry.js +1 -19
- package/dist/src/agents/native-capabilities.js +1 -237
- package/dist/src/agents/openclaw.js +2 -293
- package/dist/src/agents/opencode-managed-permissions.js +2 -187
- package/dist/src/agents/opencode.js +1 -298
- package/dist/src/agents/platform-instructions.js +17 -46
- package/dist/src/agents/runtime-compatibility.js +1 -44
- package/dist/src/agents/workbuddy-managed-permissions.js +2 -329
- package/dist/src/agents/workbuddy.js +3 -444
- package/dist/src/commands/logout.d.ts +3 -0
- package/dist/src/commands/logout.js +1 -0
- package/dist/src/daemon-ipc/paths.js +1 -1
- package/dist/src/fs/boundary.js +1 -185
- package/dist/src/fs/handler.js +1 -130
- package/dist/src/fs/security.js +1 -32
- package/dist/src/fs/text-decoder.js +1 -110
- package/dist/src/index.js +3 -587
- package/dist/src/manager/prompt.js +29 -34
- package/dist/src/manager/registry.js +1 -317
- package/dist/src/manager/retired-external-channel-compat.js +1 -40
- package/dist/src/manager/runtime.js +23 -1514
- package/dist/src/native-fusion/codex-parser.d.ts +3 -1
- package/dist/src/native-fusion/codex-parser.js +4 -660
- package/dist/src/native-fusion/codex-user-input.js +5 -102
- package/dist/src/native-fusion/config.js +1 -5
- package/dist/src/native-fusion/file-watcher.js +1 -191
- package/dist/src/native-fusion/local-repository.js +2 -569
- package/dist/src/native-fusion/opencode-parser.js +3 -130
- package/dist/src/native-fusion/parser-common.d.ts +6 -1
- package/dist/src/native-fusion/parser-common.js +4 -4
- package/dist/src/native-fusion/parsers.d.ts +4 -2
- package/dist/src/native-fusion/parsers.js +3 -140
- package/dist/src/native-fusion/service.js +2 -739
- package/dist/src/native-fusion/session-header.js +2 -101
- package/dist/src/native-fusion/state.js +2 -104
- package/dist/src/native-fusion/types.js +1 -1
- package/dist/src/personal-sync/machine-authority.js +1 -34
- package/dist/src/room/activation-audit.js +2 -45
- package/dist/src/room/activation-policy.js +1 -30
- package/dist/src/room/activation-service.js +8 -408
- package/dist/src/room/invite-bootstrap.js +1 -156
- package/dist/src/room/managed-prompt-composer.d.ts +1 -1
- package/dist/src/room/managed-prompt-composer.js +17 -16
- package/dist/src/room/managed-room-binding.js +1 -167
- package/dist/src/room/managed-room-ipc.d.ts +4 -0
- package/dist/src/room/managed-room-ipc.js +2 -2
- package/dist/src/room/mirror-sync-service.d.ts +1 -0
- package/dist/src/room/mirror-sync-service.js +1 -183
- package/dist/src/room/room-binding-client.js +1 -151
- package/dist/src/session/archive-zip.js +1 -220
- package/dist/src/session/deletion-sync-state.js +2 -136
- package/dist/src/session/handlers/agent-capabilities.js +1 -14
- package/dist/src/session/handlers/agent-config.js +1 -150
- package/dist/src/session/handlers/agents.js +1 -55
- package/dist/src/session/handlers/chat.js +2 -1030
- package/dist/src/session/handlers/control.js +1 -61
- package/dist/src/session/handlers/fs.js +1 -594
- package/dist/src/session/handlers/message-status.js +1 -15
- package/dist/src/session/handlers/remote-access.js +1 -43
- package/dist/src/session/handlers/room-managed.js +1 -101
- package/dist/src/session/handlers/session-refresh.js +1 -35
- package/dist/src/session/handlers/title.js +1 -79
- package/dist/src/session/handlers/tool-detail.js +1 -149
- package/dist/src/session/handlers/voice-window.js +1 -62
- package/dist/src/session/history-subscriptions.js +1 -470
- package/dist/src/session/manager.d.ts +1 -0
- package/dist/src/session/manager.js +1 -658
- package/dist/src/session/native-cleanup-outbox.js +2 -287
- package/dist/src/session/native-session-lifecycle.js +6 -327
- package/dist/src/session/queue.d.ts +8 -0
- package/dist/src/session/queue.js +6 -6
- package/dist/src/upgrade/scheduler.js +1 -126
- package/node_modules/@shennian/wire/dist/agent-workspace.js +2 -2
- package/package.json +1 -1
|
@@ -1,34 +1,32 @@
|
|
|
1
|
-
|
|
2
|
-
// @test src/__tests__/manager-inbox.test.ts
|
|
3
|
-
export const MANAGER_SYSTEM_PROMPT = `你是项目经理,是当前项目的管理者。
|
|
1
|
+
const s=`\u4F60\u662F\u9879\u76EE\u7ECF\u7406\uFF0C\u662F\u5F53\u524D\u9879\u76EE\u7684\u7BA1\u7406\u8005\u3002
|
|
4
2
|
|
|
5
|
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
3
|
+
\u4F60\u7684\u804C\u8D23\uFF1A
|
|
4
|
+
- \u7406\u89E3\u7528\u6237\u76EE\u6807\u3002
|
|
5
|
+
- \u62C6\u89E3\u4EFB\u52A1\u3002
|
|
6
|
+
- \u521B\u5EFA\u3001\u6307\u6D3E\u3001\u89C2\u5BDF\u548C\u505C\u6B62\u540C\u4E00\u9879\u76EE\u76EE\u5F55\u4E0B\u7684 worker Agent session\u3002
|
|
7
|
+
- \u6C47\u603B worker \u7ED3\u679C\u3002
|
|
8
|
+
- \u5224\u65AD\u662F\u5426\u9700\u8981\u7EE7\u7EED\u7B49\u5F85\u3001\u8C03\u6574\u5B89\u6392\u3001\u8BE2\u95EE\u7528\u6237\u6216\u9A8C\u6536\u3002
|
|
9
|
+
- \u5728\u9879\u76EE .shennian/ \u76EE\u5F55\u4E0B\u7EF4\u62A4\u5FC5\u8981\u7684\u8BA1\u5212\u3001\u8BB0\u5F55\u548C\u9879\u76EE\u8BB0\u5FC6\u3002
|
|
12
10
|
|
|
13
|
-
|
|
14
|
-
-
|
|
15
|
-
-
|
|
16
|
-
-
|
|
17
|
-
-
|
|
18
|
-
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
- sessions read
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
-
|
|
29
|
-
-
|
|
11
|
+
\u4F60\u7684\u8FB9\u754C\uFF1A
|
|
12
|
+
- \u4E0D\u8981\u628A\u81EA\u5DF1\u5F53\u4F5C\u4E3B\u8981\u6267\u884C\u8005\u3002
|
|
13
|
+
- \u4E0D\u8981\u76F4\u63A5\u7F16\u8F91\u4E1A\u52A1\u4EE3\u7801\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u4F60\u4EB2\u81EA\u6267\u884C\u3002
|
|
14
|
+
- \u53EF\u4EE5\u8BFB\u53D6\u6587\u4EF6\u3001\u641C\u7D22\u9879\u76EE\u548C\u68C0\u67E5\u4E0A\u4E0B\u6587\uFF0C\u4EE5\u4FBF\u505A\u5224\u65AD\u3002
|
|
15
|
+
- \u9700\u8981\u4FEE\u6539\u4EE3\u7801\u3001\u8FD0\u884C\u6D4B\u8BD5\u3001\u8C03\u7814\u65B9\u6848\u65F6\uFF0C\u4F18\u5148\u521B\u5EFA\u6216\u6307\u6D3E worker\u3002
|
|
16
|
+
- \u6BCF\u6B21\u6536\u5230\u65B0\u4EFB\u52A1\u3001\u8865\u5145\u8981\u6C42\u3001\u7EA0\u504F\u6216\u5916\u90E8\u6D88\u606F\u65F6\uFF0C\u5148\u7528 sessions list \u67E5\u770B\u5F53\u524D\u540C\u9879\u76EE worker\uFF1B\u5982\u679C\u53EF\u80FD\u76F8\u5173\uFF0C\u518D\u7528 sessions read \u8BFB\u53D6\u5FC5\u8981\u6458\u8981\u540E\u5224\u65AD\u662F\u5426\u590D\u7528\u3002
|
|
17
|
+
- \u5982\u679C\u5DF2\u6709 worker \u6B63\u5728\u5904\u7406\u540C\u4E00\u76EE\u6807\u3001\u540C\u4E00\u529F\u80FD\u533A\u3001\u540C\u4E00\u6587\u4EF6\u8303\u56F4\u6216\u540C\u4E00\u95EE\u9898\u94FE\u8DEF\uFF0C\u4F18\u5148\u7528 sessions send \u628A\u65B0\u8981\u6C42\u53D1\u7ED9\u8FD9\u4E2A worker\uFF1B\u5373\u4F7F worker \u6B63\u5FD9\u4E5F\u53EF\u4EE5\u53D1\u9001\uFF0C\u9ED8\u8BA4\u4F1A\u8FDB\u5165\u672C\u673A\u961F\u5217\uFF0C\u4E0D\u8981\u56E0\u4E3A\u5B83\u5FD9\u5C31\u65B0\u5EFA worker\u3002
|
|
18
|
+
- \u53EA\u6709\u6CA1\u6709\u76F8\u5173 worker\u3001\u73B0\u6709 worker \u5DF2\u660E\u663E\u4E0D\u9002\u5408\u7EE7\u7EED\u63A8\u8FDB\u3001\u6216\u4EFB\u52A1\u9700\u8981\u5E76\u884C\u62C6\u5206\u7ED9\u4E0D\u540C\u4E13\u957F\u65F6\uFF0C\u624D\u521B\u5EFA\u65B0\u7684 worker\u3002
|
|
19
|
+
- \u521B\u5EFA\u6216\u6307\u6D3E worker \u540E\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8981\u6C42\u4F60\u5F53\u573A\u7EE7\u7EED\u8C03\u5EA6\uFF0C\u5426\u5219\u56DE\u590D\u7528\u6237\u5DF2\u5B89\u6392\u5E76\u7ED3\u675F\u5F53\u524D turn\uFF1B\u4E0D\u8981\u4E3B\u52A8\u8F6E\u8BE2 worker \u72B6\u6001\uFF0C\u795E\u5FF5\u4F1A\u5728 worker \u7EC8\u6001\u6216\u5065\u5EB7\u6458\u8981\u5230\u6765\u65F6\u91CD\u65B0\u5524\u9192\u4F60\u3002
|
|
20
|
+
- sessions read \u8FD4\u56DE\u7684\u662F\u7ED9\u7BA1\u7406\u8005\u770B\u7684\u7B80\u6D01\u8FDB\u5C55\u3001\u5DE5\u5177\u6458\u8981\u548C\u6700\u7EC8\u7ED3\u679C\uFF0C\u4E0D\u662F\u539F\u59CB\u6D41\u5F0F token\uFF1B\u4E0D\u8981\u8981\u6C42\u8BFB\u53D6\u6216\u8F6C\u8FF0\u5B8C\u6574\u6D41\u5F0F\u65E5\u5FD7\u3002
|
|
21
|
+
- \u53EA\u80FD\u7BA1\u7406\u4E0E\u4F60\u5904\u4E8E\u540C\u4E00\u53F0\u673A\u5668\u3001\u540C\u4E00\u9879\u76EE\u76EE\u5F55\u7684\u4F1A\u8BDD\uFF1B\u4E0D\u8981\u8DE8\u673A\u5668\u6216\u8DE8\u9879\u76EE\u8C03\u5EA6\u3002
|
|
22
|
+
- \u4E0D\u8981\u65E0\u9650\u5FAA\u73AF\uFF1B\u6CA1\u6709\u660E\u786E\u4E0B\u4E00\u6B65\u65F6\u8BE2\u95EE\u7528\u6237\u6216\u7ED3\u675F\u5F53\u524D turn \u7B49\u5F85\u7CFB\u7EDF\u4E8B\u4EF6\u3002
|
|
23
|
+
- \u4E0D\u8981\u81EA\u5DF1\u8BBE\u7F6E\u5B9A\u65F6\u5524\u9192\uFF1B\u795E\u5FF5\u4F1A\u5728\u7528\u6237\u6D88\u606F\u3001worker \u7EC8\u6001\u6216 worker \u957F\u8FD0\u884C\u5065\u5EB7\u6458\u8981\u5230\u6765\u65F6\u5524\u9192\u4F60\u3002
|
|
24
|
+
- \u5916\u90E8\u6D88\u606F\u901A\u9053\u4E8B\u4EF6\u4F1A\u50CF\u666E\u901A\u7528\u6237\u6D88\u606F\u4E00\u6837\u9001\u8FBE\uFF0C\u683C\u5F0F\u4E3A\u201C\u5916\u90E8\u5BF9\u8BDD: <\u5BF9\u8BDD\u540D\u79F0>\u201D\u540E\u8DDF\u201C\u5BF9\u65B9: <\u5185\u5BB9\u6216\u9644\u4EF6\u94FE\u63A5>\u201D\uFF0C\u53EF\u80FD\u662F\u5408\u5E76\u6D88\u606F\uFF0C\u4E5F\u53EF\u80FD\u5305\u542B\u56FE\u7247\u3001\u89C6\u9891\u6216\u6587\u4EF6 URL\u3002
|
|
25
|
+
- \u5916\u90E8\u6D88\u606F\u662F\u5426\u9700\u8981\u56DE\u590D\u3001\u8FFD\u95EE\u3001\u5FFD\u7565\u3001\u8F6C\u4EA4\u5185\u90E8\u8D1F\u8D23\u4EBA\uFF0C\u6216\u521B\u5EFA/\u6307\u6D3E worker\uFF0C\u7531\u4F60\u6839\u636E\u9879\u76EE\u4E0A\u4E0B\u6587\u663E\u5F0F\u5224\u65AD\u3002
|
|
26
|
+
- \u5BF9\u5916\u4F60\u662F\u5F53\u524D\u9879\u76EE\u7684\u9879\u76EE\u7ECF\u7406\uFF0C\u4E0D\u8981\u81EA\u79F0\u795E\u5FF5\u3001Manager Agent \u6216 worker\uFF0C\u4E5F\u4E0D\u8981\u89E3\u91CA\u5185\u90E8\u8C03\u5EA6\u673A\u5236\uFF1B\u53EA\u5728\u9700\u8981\u65F6\u7528\u201C\u6211\u8FD9\u8FB9/\u6211\u4EEC\u8FD9\u8FB9\u201D\u6C9F\u901A\u3002
|
|
27
|
+
- \u4E0D\u8981\u628A\u6240\u6709\u7EC6\u8282\u585E\u8FDB\u5BF9\u8BDD\u4E0A\u4E0B\u6587\uFF1B\u9700\u8981\u957F\u671F\u4FDD\u5B58\u7684\u4FE1\u606F\u5199\u5230\u9879\u76EE .shennian/ \u4E0B\u3002
|
|
30
28
|
|
|
31
|
-
|
|
29
|
+
\u9700\u8981\u7BA1\u7406 worker \u6216\u5916\u90E8\u901A\u9053\u65F6\uFF0C\u4F7F\u7528\u672C\u5730\u547D\u4EE4\uFF1A
|
|
32
30
|
- shennian manager sessions list --json
|
|
33
31
|
- shennian manager sessions start --agent <codex|claude|gemini|cursor|opencode|custom:name> --workdir <path> --message <text>
|
|
34
32
|
- shennian manager sessions send --session-id <id> --message <text>
|
|
@@ -36,13 +34,10 @@ export const MANAGER_SYSTEM_PROMPT = `你是项目经理,是当前项目的管
|
|
|
36
34
|
- shennian manager sessions queue list --session-id <id> --json
|
|
37
35
|
- shennian manager sessions queue edit --session-id <id> --message-id <queueMessageId> --message <text>
|
|
38
36
|
- shennian manager sessions queue delete --session-id <id> --message-id <queueMessageId>
|
|
39
|
-
- shennian manager sessions stop --session-id <id
|
|
37
|
+
- shennian manager sessions stop --session-id <id>\uFF08\u7EC8\u6B62\u6B63\u5728\u8FD0\u884C\u7684 worker\uFF1B\u4E5F\u53EF\u7528 terminate/kill \u522B\u540D\uFF09
|
|
40
38
|
- shennian manager sessions read --session-id <id> --limit 200 --json
|
|
41
39
|
- shennian manager memory path
|
|
42
40
|
|
|
43
|
-
|
|
41
|
+
\u53EF\u521B\u5EFA\u7684 worker Agent \u5305\u62EC Codex\u3001Claude Code\u3001Gemini\u3001Cursor\u3001opencode\u3001Nian\uFF0C\u4EE5\u53CA\u672C\u673A custom agent\uFF08custom:<name>\uFF09\u3002\u9ED8\u8BA4\u7528 sessions send \u6392\u961F\u53D1\u9001 worker \u6D88\u606F\uFF1Aworker \u6B63\u5FD9\u65F6\u6D88\u606F\u4F1A\u5728\u672C\u673A daemon \u961F\u5217\u91CC\u7B49\u5F85\uFF0Cworker \u7A7A\u95F2\u65F6\u81EA\u52A8\u6267\u884C\u3002\u961F\u5217\u91CC\u7684\u672A\u6267\u884C\u6D88\u606F\u53EF\u4EE5 list/edit/delete\uFF1B\u5DF2\u7ECF\u5F00\u59CB\u6267\u884C\u7684\u6D88\u606F\u4E0D\u80FD\u7F16\u8F91\u6216\u5220\u9664\uFF0C\u53EA\u80FD stop \u540E\u91CD\u65B0\u53D1\u9001\u3002\u53EA\u6709\u660E\u786E\u9700\u8981\u6253\u65AD\u987A\u5E8F\u65F6\u624D\u4F7F\u7528 --direct\u3002
|
|
44
42
|
|
|
45
|
-
|
|
46
|
-
export function buildManagerPrompt(userText) {
|
|
47
|
-
return userText;
|
|
48
|
-
}
|
|
43
|
+
\u8FD9\u4E9B\u547D\u4EE4\u5DF2\u7ECF\u7531\u795E\u5FF5\u6CE8\u5165\u5F53\u524D Manager \u8EAB\u4EFD\u548C\u540C\u9879\u76EE\u6743\u9650\u8FB9\u754C\u3002\u4E0D\u8981\u5C1D\u8BD5\u4F2A\u9020 Manager session id\u3002`;function n(e){return e}export{s as MANAGER_SYSTEM_PROMPT,n as buildManagerPrompt};
|
|
@@ -1,317 +1 @@
|
|
|
1
|
-
|
|
2
|
-
// @test src/__tests__/manager-inbox.test.ts
|
|
3
|
-
import fs from 'node:fs';
|
|
4
|
-
import path from 'node:path';
|
|
5
|
-
import { randomUUID } from 'node:crypto';
|
|
6
|
-
import { isAgentHiddenPayload, sessionPreviewFromPayload } from '@shennian/wire';
|
|
7
|
-
import { resolveShennianPath } from '../config/index.js';
|
|
8
|
-
import { listSessionRecords, readMessages } from '../session/store.js';
|
|
9
|
-
import { listProjectedSessions } from '../session/projection.js';
|
|
10
|
-
const REGISTRY_PATH = resolveShennianPath('manager-registry.json');
|
|
11
|
-
function nowIso() {
|
|
12
|
-
return new Date().toISOString();
|
|
13
|
-
}
|
|
14
|
-
function emptyRegistry() {
|
|
15
|
-
return { managers: {}, workers: {}, replyTargets: {}, inbox: {} };
|
|
16
|
-
}
|
|
17
|
-
export class ManagerRegistry {
|
|
18
|
-
load() {
|
|
19
|
-
try {
|
|
20
|
-
const parsed = JSON.parse(fs.readFileSync(REGISTRY_PATH, 'utf-8'));
|
|
21
|
-
return {
|
|
22
|
-
managers: parsed.managers ?? {},
|
|
23
|
-
workers: parsed.workers ?? {},
|
|
24
|
-
replyTargets: parsed.replyTargets ?? {},
|
|
25
|
-
inbox: parsed.inbox ?? {},
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
catch {
|
|
29
|
-
return emptyRegistry();
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
save(registry) {
|
|
33
|
-
fs.mkdirSync(path.dirname(REGISTRY_PATH), { recursive: true });
|
|
34
|
-
fs.writeFileSync(REGISTRY_PATH, JSON.stringify(registry, null, 2));
|
|
35
|
-
}
|
|
36
|
-
upsertManager(input) {
|
|
37
|
-
const registry = this.load();
|
|
38
|
-
const existing = registry.managers[input.sessionId];
|
|
39
|
-
const timestamp = nowIso();
|
|
40
|
-
const record = {
|
|
41
|
-
sessionId: input.sessionId,
|
|
42
|
-
agentSessionId: input.agentSessionId ?? existing?.agentSessionId ?? null,
|
|
43
|
-
workDir: input.workDir,
|
|
44
|
-
machineId: input.machineId ?? existing?.machineId ?? null,
|
|
45
|
-
modelId: input.modelId,
|
|
46
|
-
agentType: input.agentType ?? existing?.agentType ?? 'manager',
|
|
47
|
-
providerModelId: input.providerModelId ?? existing?.providerModelId ?? null,
|
|
48
|
-
defaultWorkerAgentType: input.defaultWorkerAgentType ?? existing?.defaultWorkerAgentType ?? null,
|
|
49
|
-
defaultWorkerModelId: input.defaultWorkerModelId ?? existing?.defaultWorkerModelId ?? null,
|
|
50
|
-
status: input.status ?? existing?.status ?? 'idle',
|
|
51
|
-
managedWorkerSessionIds: existing?.managedWorkerSessionIds ?? [],
|
|
52
|
-
attachedExternalChannels: existing?.attachedExternalChannels ?? [],
|
|
53
|
-
createdAt: existing?.createdAt ?? timestamp,
|
|
54
|
-
updatedAt: timestamp,
|
|
55
|
-
};
|
|
56
|
-
registry.managers[input.sessionId] = record;
|
|
57
|
-
this.save(registry);
|
|
58
|
-
return record;
|
|
59
|
-
}
|
|
60
|
-
getManager(sessionId) {
|
|
61
|
-
return this.load().managers[sessionId];
|
|
62
|
-
}
|
|
63
|
-
enqueueInboxEvent(input) {
|
|
64
|
-
const registry = this.load();
|
|
65
|
-
const manager = registry.managers[input.managerSessionId];
|
|
66
|
-
const worker = registry.workers[input.workerSessionId];
|
|
67
|
-
if (!manager || !worker)
|
|
68
|
-
return null;
|
|
69
|
-
if (worker.managedBy !== manager.sessionId || worker.workDir !== manager.workDir)
|
|
70
|
-
return null;
|
|
71
|
-
const timestamp = nowIso();
|
|
72
|
-
const events = registry.inbox[input.managerSessionId] ?? [];
|
|
73
|
-
const dedupeIndex = events.findIndex((event) => event.workerSessionId === input.workerSessionId && (input.kind === 'worker.health'
|
|
74
|
-
? event.kind === 'worker.health'
|
|
75
|
-
: event.kind === input.kind && event.runId === input.runId));
|
|
76
|
-
const event = dedupeIndex >= 0
|
|
77
|
-
? {
|
|
78
|
-
...events[dedupeIndex],
|
|
79
|
-
...input,
|
|
80
|
-
updatedAt: timestamp,
|
|
81
|
-
}
|
|
82
|
-
: {
|
|
83
|
-
...input,
|
|
84
|
-
id: `mie_${randomUUID()}`,
|
|
85
|
-
createdAt: timestamp,
|
|
86
|
-
updatedAt: timestamp,
|
|
87
|
-
};
|
|
88
|
-
if (dedupeIndex >= 0)
|
|
89
|
-
events[dedupeIndex] = event;
|
|
90
|
-
else
|
|
91
|
-
events.push(event);
|
|
92
|
-
registry.inbox[input.managerSessionId] = events;
|
|
93
|
-
this.save(registry);
|
|
94
|
-
return event;
|
|
95
|
-
}
|
|
96
|
-
listInboxEvents(managerSessionId) {
|
|
97
|
-
return [...(this.load().inbox[managerSessionId] ?? [])]
|
|
98
|
-
.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
|
|
99
|
-
}
|
|
100
|
-
removeInboxEvents(managerSessionId, eventIds) {
|
|
101
|
-
if (!eventIds.length)
|
|
102
|
-
return;
|
|
103
|
-
const registry = this.load();
|
|
104
|
-
const ids = new Set(eventIds);
|
|
105
|
-
registry.inbox[managerSessionId] = (registry.inbox[managerSessionId] ?? [])
|
|
106
|
-
.filter((event) => !ids.has(event.id));
|
|
107
|
-
this.save(registry);
|
|
108
|
-
}
|
|
109
|
-
addWorker(input) {
|
|
110
|
-
const registry = this.load();
|
|
111
|
-
const manager = registry.managers[input.managerSessionId];
|
|
112
|
-
if (!manager)
|
|
113
|
-
throw new Error('Manager runtime is not registered');
|
|
114
|
-
const sessionId = input.sessionId ?? `sess_worker_${randomUUID()}`;
|
|
115
|
-
const timestamp = nowIso();
|
|
116
|
-
const record = {
|
|
117
|
-
sessionId,
|
|
118
|
-
agentType: input.agentType,
|
|
119
|
-
workDir: input.workDir,
|
|
120
|
-
managedBy: input.managerSessionId,
|
|
121
|
-
status: 'running',
|
|
122
|
-
createdAt: timestamp,
|
|
123
|
-
updatedAt: timestamp,
|
|
124
|
-
lastActivityAt: timestamp,
|
|
125
|
-
summary: input.summary ?? null,
|
|
126
|
-
agentSessionId: null,
|
|
127
|
-
runId: null,
|
|
128
|
-
};
|
|
129
|
-
registry.workers[sessionId] = record;
|
|
130
|
-
if (!manager.managedWorkerSessionIds.includes(sessionId)) {
|
|
131
|
-
manager.managedWorkerSessionIds.push(sessionId);
|
|
132
|
-
}
|
|
133
|
-
manager.updatedAt = timestamp;
|
|
134
|
-
this.save(registry);
|
|
135
|
-
return record;
|
|
136
|
-
}
|
|
137
|
-
updateWorker(sessionId, patch) {
|
|
138
|
-
const registry = this.load();
|
|
139
|
-
const existing = registry.workers[sessionId];
|
|
140
|
-
if (!existing)
|
|
141
|
-
return undefined;
|
|
142
|
-
const record = {
|
|
143
|
-
...existing,
|
|
144
|
-
...patch,
|
|
145
|
-
updatedAt: nowIso(),
|
|
146
|
-
};
|
|
147
|
-
registry.workers[sessionId] = record;
|
|
148
|
-
this.save(registry);
|
|
149
|
-
return record;
|
|
150
|
-
}
|
|
151
|
-
listWorkers(managerSessionId, opts = {}) {
|
|
152
|
-
const registry = this.load();
|
|
153
|
-
const manager = registry.managers[managerSessionId];
|
|
154
|
-
if (!manager)
|
|
155
|
-
return [];
|
|
156
|
-
const managedWorkers = Object.values(registry.workers)
|
|
157
|
-
.filter((worker) => worker.workDir === manager.workDir)
|
|
158
|
-
.filter((worker) => opts.includeManagers || worker.agentType !== 'manager')
|
|
159
|
-
.map((worker) => this.decorateManagedWorker(worker, opts.runningSessionIds));
|
|
160
|
-
const managedIds = new Set(managedWorkers.map((worker) => worker.sessionId));
|
|
161
|
-
const projectSessions = listSessionRecords()
|
|
162
|
-
.filter((session) => session.workDir === manager.workDir)
|
|
163
|
-
.filter((session) => opts.includeManagers || session.agentType !== 'manager')
|
|
164
|
-
.filter((session) => !managedIds.has(session.sessionId))
|
|
165
|
-
.map((session) => this.sessionRecordToWorker(session, opts.runningSessionIds));
|
|
166
|
-
const knownIds = new Set([...managedWorkers, ...projectSessions].map((session) => session.sessionId));
|
|
167
|
-
const projectedSource = opts.projectedSessions ?? listProjectedSessions();
|
|
168
|
-
const projectedSessions = projectedSource
|
|
169
|
-
.filter((session) => session.workDir === manager.workDir)
|
|
170
|
-
.filter((session) => opts.includeManagers || session.agentType !== 'manager')
|
|
171
|
-
.filter((session) => !knownIds.has(session.id))
|
|
172
|
-
.map((session) => this.projectedSessionToWorker(session, opts.runningSessionIds));
|
|
173
|
-
return [...managedWorkers, ...projectSessions, ...projectedSessions]
|
|
174
|
-
.sort((a, b) => b.lastActivityAt.localeCompare(a.lastActivityAt));
|
|
175
|
-
}
|
|
176
|
-
getWorkerForManager(managerSessionId, sessionId) {
|
|
177
|
-
const registry = this.load();
|
|
178
|
-
const manager = registry.managers[managerSessionId];
|
|
179
|
-
const worker = registry.workers[sessionId];
|
|
180
|
-
if (!manager)
|
|
181
|
-
return undefined;
|
|
182
|
-
if (worker) {
|
|
183
|
-
if (worker.workDir !== manager.workDir)
|
|
184
|
-
return undefined;
|
|
185
|
-
if (worker.agentType === 'manager')
|
|
186
|
-
return undefined;
|
|
187
|
-
return this.decorateManagedWorker(worker);
|
|
188
|
-
}
|
|
189
|
-
const session = listSessionRecords().find((item) => item.sessionId === sessionId);
|
|
190
|
-
if (!session || session.workDir !== manager.workDir || session.agentType === 'manager')
|
|
191
|
-
return undefined;
|
|
192
|
-
return this.sessionRecordToWorker(session);
|
|
193
|
-
}
|
|
194
|
-
decorateManagedWorker(worker, runningSessionIds) {
|
|
195
|
-
const status = runningSessionIds?.has(worker.sessionId) ? 'running' : worker.status;
|
|
196
|
-
const transcript = this.readTranscriptSummary(worker.sessionId, worker.summary ?? null);
|
|
197
|
-
const lastMessagePreview = transcript.lastMessagePreview ?? worker.lastMessagePreview ?? worker.summary ?? null;
|
|
198
|
-
const userGoal = worker.userGoal ?? transcript.userGoal ?? null;
|
|
199
|
-
return {
|
|
200
|
-
...worker,
|
|
201
|
-
managedBy: worker.managedBy ?? null,
|
|
202
|
-
status,
|
|
203
|
-
title: worker.title ?? userGoal ?? lastMessagePreview ?? worker.summary ?? worker.sessionId,
|
|
204
|
-
userGoal,
|
|
205
|
-
lastMessagePreview,
|
|
206
|
-
summary: worker.summary ?? lastMessagePreview,
|
|
207
|
-
canResume: worker.canResume ?? worker.status !== 'aborted',
|
|
208
|
-
source: worker.source ?? 'manager_registry',
|
|
209
|
-
role: 'managed_worker',
|
|
210
|
-
};
|
|
211
|
-
}
|
|
212
|
-
sessionRecordToWorker(session, runningSessionIds) {
|
|
213
|
-
const transcript = this.readTranscriptSummary(session.sessionId, session.lastMessagePreview ?? null);
|
|
214
|
-
const lastMessagePreview = transcript.lastMessagePreview ?? session.lastMessagePreview ?? null;
|
|
215
|
-
const userGoal = transcript.userGoal;
|
|
216
|
-
const status = runningSessionIds?.has(session.sessionId)
|
|
217
|
-
? 'running'
|
|
218
|
-
: session.status === 'failed'
|
|
219
|
-
? 'error'
|
|
220
|
-
: session.status === 'completed'
|
|
221
|
-
? 'final'
|
|
222
|
-
: 'idle';
|
|
223
|
-
return {
|
|
224
|
-
sessionId: session.sessionId,
|
|
225
|
-
agentType: session.agentType,
|
|
226
|
-
workDir: session.workDir,
|
|
227
|
-
managedBy: null,
|
|
228
|
-
status,
|
|
229
|
-
createdAt: session.createdAt,
|
|
230
|
-
updatedAt: session.updatedAt,
|
|
231
|
-
lastActivityAt: session.lastActivityAt,
|
|
232
|
-
title: userGoal ?? lastMessagePreview ?? session.sessionId,
|
|
233
|
-
userGoal,
|
|
234
|
-
lastMessagePreview,
|
|
235
|
-
summary: lastMessagePreview ?? userGoal ?? null,
|
|
236
|
-
agentSessionId: session.agentSessionId ?? null,
|
|
237
|
-
runId: null,
|
|
238
|
-
canResume: Boolean(session.agentSessionId),
|
|
239
|
-
source: 'local_index',
|
|
240
|
-
role: 'project_session',
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
projectedSessionToWorker(session, runningSessionIds) {
|
|
244
|
-
const lastMessagePreview = session.lastMessagePreview ?? null;
|
|
245
|
-
const userGoal = session.title?.trim() || lastMessagePreview;
|
|
246
|
-
const status = runningSessionIds?.has(session.id)
|
|
247
|
-
? 'running'
|
|
248
|
-
: session.status === 'failed'
|
|
249
|
-
? 'error'
|
|
250
|
-
: session.status === 'completed'
|
|
251
|
-
? 'final'
|
|
252
|
-
: 'idle';
|
|
253
|
-
return {
|
|
254
|
-
sessionId: session.id,
|
|
255
|
-
agentType: session.agentType,
|
|
256
|
-
workDir: session.workDir,
|
|
257
|
-
managedBy: null,
|
|
258
|
-
status,
|
|
259
|
-
createdAt: session.createdAt,
|
|
260
|
-
updatedAt: session.updatedAt,
|
|
261
|
-
lastActivityAt: session.lastActivityAt || session.updatedAt,
|
|
262
|
-
title: userGoal ?? session.id,
|
|
263
|
-
userGoal: userGoal ?? null,
|
|
264
|
-
lastMessagePreview,
|
|
265
|
-
summary: lastMessagePreview ?? userGoal ?? null,
|
|
266
|
-
agentSessionId: session.agentSessionId ?? null,
|
|
267
|
-
runId: session.activity?.runId ?? null,
|
|
268
|
-
canResume: true,
|
|
269
|
-
source: 'app_projection',
|
|
270
|
-
role: 'project_session',
|
|
271
|
-
};
|
|
272
|
-
}
|
|
273
|
-
readTranscriptSummary(sessionId, fallbackPreview) {
|
|
274
|
-
const messages = readMessages(sessionId, { limit: 200 });
|
|
275
|
-
if (!messages.length)
|
|
276
|
-
return { userGoal: null, lastMessagePreview: fallbackPreview };
|
|
277
|
-
const chronological = [...messages].sort((a, b) => a.ts - b.ts);
|
|
278
|
-
const firstUser = chronological.find((message) => message.role === 'user');
|
|
279
|
-
const lastReadable = [...chronological].reverse().find((message) => readableText(message));
|
|
280
|
-
return {
|
|
281
|
-
userGoal: firstUser ? clip(readableText(firstUser), 160) : null,
|
|
282
|
-
lastMessagePreview: clip(readableText(lastReadable), 180) ?? fallbackPreview,
|
|
283
|
-
};
|
|
284
|
-
}
|
|
285
|
-
createReplyTarget(input) {
|
|
286
|
-
const registry = this.load();
|
|
287
|
-
const record = {
|
|
288
|
-
replyTarget: `rt_${randomUUID()}`,
|
|
289
|
-
managerSessionId: input.managerSessionId,
|
|
290
|
-
channelId: input.channelId,
|
|
291
|
-
conversationId: input.conversationId,
|
|
292
|
-
messageId: input.messageId ?? null,
|
|
293
|
-
createdAt: nowIso(),
|
|
294
|
-
};
|
|
295
|
-
registry.replyTargets[record.replyTarget] = record;
|
|
296
|
-
this.save(registry);
|
|
297
|
-
return record;
|
|
298
|
-
}
|
|
299
|
-
getReplyTarget(replyTarget) {
|
|
300
|
-
return this.load().replyTargets[replyTarget];
|
|
301
|
-
}
|
|
302
|
-
getLatestReplyTargetForManager(managerSessionId) {
|
|
303
|
-
return Object.values(this.load().replyTargets)
|
|
304
|
-
.filter((target) => target.managerSessionId === managerSessionId)
|
|
305
|
-
.sort((a, b) => b.createdAt.localeCompare(a.createdAt))[0];
|
|
306
|
-
}
|
|
307
|
-
}
|
|
308
|
-
function readableText(message) {
|
|
309
|
-
if (!message || isAgentHiddenPayload(message.payload))
|
|
310
|
-
return null;
|
|
311
|
-
return sessionPreviewFromPayload(message.payload, 180);
|
|
312
|
-
}
|
|
313
|
-
function clip(text, max) {
|
|
314
|
-
if (!text)
|
|
315
|
-
return null;
|
|
316
|
-
return text.length > max ? `${text.slice(0, max)}...` : text;
|
|
317
|
-
}
|
|
1
|
+
import g from"node:fs";import S from"node:path";import{randomUUID as m}from"node:crypto";import{isAgentHiddenPayload as w,sessionPreviewFromPayload as A}from"@shennian/wire";import{resolveShennianPath as T}from"../config/index.js";import{listSessionRecords as f,readMessages as v}from"../session/store.js";import{listProjectedSessions as M}from"../session/projection.js";const I=T("manager-registry.json");function u(){return new Date().toISOString()}function W(){return{managers:{},workers:{},replyTargets:{},inbox:{}}}class G{load(){try{const e=JSON.parse(g.readFileSync(I,"utf-8"));return{managers:e.managers??{},workers:e.workers??{},replyTargets:e.replyTargets??{},inbox:e.inbox??{}}}catch{return W()}}save(e){g.mkdirSync(S.dirname(I),{recursive:!0}),g.writeFileSync(I,JSON.stringify(e,null,2))}upsertManager(e){const t=this.load(),r=t.managers[e.sessionId],s=u(),a={sessionId:e.sessionId,agentSessionId:e.agentSessionId??r?.agentSessionId??null,workDir:e.workDir,machineId:e.machineId??r?.machineId??null,modelId:e.modelId,agentType:e.agentType??r?.agentType??"manager",providerModelId:e.providerModelId??r?.providerModelId??null,defaultWorkerAgentType:e.defaultWorkerAgentType??r?.defaultWorkerAgentType??null,defaultWorkerModelId:e.defaultWorkerModelId??r?.defaultWorkerModelId??null,status:e.status??r?.status??"idle",managedWorkerSessionIds:r?.managedWorkerSessionIds??[],attachedExternalChannels:r?.attachedExternalChannels??[],createdAt:r?.createdAt??s,updatedAt:s};return t.managers[e.sessionId]=a,this.save(t),a}getManager(e){return this.load().managers[e]}enqueueInboxEvent(e){const t=this.load(),r=t.managers[e.managerSessionId],s=t.workers[e.workerSessionId];if(!r||!s||s.managedBy!==r.sessionId||s.workDir!==r.workDir)return null;const a=u(),o=t.inbox[e.managerSessionId]??[],d=o.findIndex(c=>c.workerSessionId===e.workerSessionId&&(e.kind==="worker.health"?c.kind==="worker.health":c.kind===e.kind&&c.runId===e.runId)),l=d>=0?{...o[d],...e,updatedAt:a}:{...e,id:`mie_${m()}`,createdAt:a,updatedAt:a};return d>=0?o[d]=l:o.push(l),t.inbox[e.managerSessionId]=o,this.save(t),l}listInboxEvents(e){return[...this.load().inbox[e]??[]].sort((t,r)=>t.createdAt.localeCompare(r.createdAt))}removeInboxEvents(e,t){if(!t.length)return;const r=this.load(),s=new Set(t);r.inbox[e]=(r.inbox[e]??[]).filter(a=>!s.has(a.id)),this.save(r)}addWorker(e){const t=this.load(),r=t.managers[e.managerSessionId];if(!r)throw new Error("Manager runtime is not registered");const s=e.sessionId??`sess_worker_${m()}`,a=u(),o={sessionId:s,agentType:e.agentType,workDir:e.workDir,managedBy:e.managerSessionId,status:"running",createdAt:a,updatedAt:a,lastActivityAt:a,summary:e.summary??null,agentSessionId:null,runId:null};return t.workers[s]=o,r.managedWorkerSessionIds.includes(s)||r.managedWorkerSessionIds.push(s),r.updatedAt=a,this.save(t),o}updateWorker(e,t){const r=this.load(),s=r.workers[e];if(!s)return;const a={...s,...t,updatedAt:u()};return r.workers[e]=a,this.save(r),a}listWorkers(e,t={}){const r=this.load(),s=r.managers[e];if(!s)return[];const a=Object.values(r.workers).filter(n=>n.workDir===s.workDir).filter(n=>t.includeManagers||n.agentType!=="manager").map(n=>this.decorateManagedWorker(n,t.runningSessionIds)),o=new Set(a.map(n=>n.sessionId)),d=f().filter(n=>n.workDir===s.workDir).filter(n=>t.includeManagers||n.agentType!=="manager").filter(n=>!o.has(n.sessionId)).map(n=>this.sessionRecordToWorker(n,t.runningSessionIds)),l=new Set([...a,...d].map(n=>n.sessionId)),h=(t.projectedSessions??M()).filter(n=>n.workDir===s.workDir).filter(n=>t.includeManagers||n.agentType!=="manager").filter(n=>!l.has(n.id)).map(n=>this.projectedSessionToWorker(n,t.runningSessionIds));return[...a,...d,...h].sort((n,k)=>k.lastActivityAt.localeCompare(n.lastActivityAt))}getWorkerForManager(e,t){const r=this.load(),s=r.managers[e],a=r.workers[t];if(!s)return;if(a)return a.workDir!==s.workDir||a.agentType==="manager"?void 0:this.decorateManagedWorker(a);const o=f().find(d=>d.sessionId===t);if(!(!o||o.workDir!==s.workDir||o.agentType==="manager"))return this.sessionRecordToWorker(o)}decorateManagedWorker(e,t){const r=t?.has(e.sessionId)?"running":e.status,s=this.readTranscriptSummary(e.sessionId,e.summary??null),a=s.lastMessagePreview??e.lastMessagePreview??e.summary??null,o=e.userGoal??s.userGoal??null;return{...e,managedBy:e.managedBy??null,status:r,title:e.title??o??a??e.summary??e.sessionId,userGoal:o,lastMessagePreview:a,summary:e.summary??a,canResume:e.canResume??e.status!=="aborted",source:e.source??"manager_registry",role:"managed_worker"}}sessionRecordToWorker(e,t){const r=this.readTranscriptSummary(e.sessionId,e.lastMessagePreview??null),s=r.lastMessagePreview??e.lastMessagePreview??null,a=r.userGoal,o=t?.has(e.sessionId)?"running":e.status==="failed"?"error":e.status==="completed"?"final":"idle";return{sessionId:e.sessionId,agentType:e.agentType,workDir:e.workDir,managedBy:null,status:o,createdAt:e.createdAt,updatedAt:e.updatedAt,lastActivityAt:e.lastActivityAt,title:a??s??e.sessionId,userGoal:a,lastMessagePreview:s,summary:s??a??null,agentSessionId:e.agentSessionId??null,runId:null,canResume:!!e.agentSessionId,source:"local_index",role:"project_session"}}projectedSessionToWorker(e,t){const r=e.lastMessagePreview??null,s=e.title?.trim()||r,a=t?.has(e.id)?"running":e.status==="failed"?"error":e.status==="completed"?"final":"idle";return{sessionId:e.id,agentType:e.agentType,workDir:e.workDir,managedBy:null,status:a,createdAt:e.createdAt,updatedAt:e.updatedAt,lastActivityAt:e.lastActivityAt||e.updatedAt,title:s??e.id,userGoal:s??null,lastMessagePreview:r,summary:r??s??null,agentSessionId:e.agentSessionId??null,runId:e.activity?.runId??null,canResume:!0,source:"app_projection",role:"project_session"}}readTranscriptSummary(e,t){const r=v(e,{limit:200});if(!r.length)return{userGoal:null,lastMessagePreview:t};const s=[...r].sort((d,l)=>d.ts-l.ts),a=s.find(d=>d.role==="user"),o=[...s].reverse().find(d=>y(d));return{userGoal:a?p(y(a),160):null,lastMessagePreview:p(y(o),180)??t}}createReplyTarget(e){const t=this.load(),r={replyTarget:`rt_${m()}`,managerSessionId:e.managerSessionId,channelId:e.channelId,conversationId:e.conversationId,messageId:e.messageId??null,createdAt:u()};return t.replyTargets[r.replyTarget]=r,this.save(t),r}getReplyTarget(e){return this.load().replyTargets[e]}getLatestReplyTargetForManager(e){return Object.values(this.load().replyTargets).filter(t=>t.managerSessionId===e).sort((t,r)=>r.createdAt.localeCompare(t.createdAt))[0]}}function y(i){return!i||w(i.payload)?null:A(i.payload,180)}function p(i,e){return i?i.length>e?`${i.slice(0,e)}...`:i:null}export{G as ManagerRegistry};
|
|
@@ -1,40 +1 @@
|
|
|
1
|
-
const
|
|
2
|
-
export class RetiredChannelRuntime {
|
|
3
|
-
constructor(_onMessage, _createReplyTarget, _options) { }
|
|
4
|
-
async start() { }
|
|
5
|
-
async stop() { }
|
|
6
|
-
getManagerChannel(..._args) { return null; }
|
|
7
|
-
getManagerChannelStatus(..._args) { return null; }
|
|
8
|
-
getChannelStatusById(..._args) { return null; }
|
|
9
|
-
getChannelById(..._args) { return undefined; }
|
|
10
|
-
listManagerChannelStatuses(..._args) { return []; }
|
|
11
|
-
listManagerExternalChannels(..._args) { return []; }
|
|
12
|
-
listChannelIdsManagedBy(..._args) { return []; }
|
|
13
|
-
getDefaultReplyTarget(..._args) { return retired(); }
|
|
14
|
-
upsertManagerChannel(..._args) { return retired(); }
|
|
15
|
-
upsertManagerWeChatRpaChannel(..._args) { return retired(); }
|
|
16
|
-
syncManagerWeChatRpaChannel(..._args) { return retired(); }
|
|
17
|
-
cancelManagerWeChatRpaOutbound(..._args) { return retired(); }
|
|
18
|
-
deleteManagerWeChatRpaChannel(..._args) { return retired(); }
|
|
19
|
-
reply(..._args) { return retired(); }
|
|
20
|
-
}
|
|
21
|
-
export class RetiredWeChatRpaSessionBindingSync {
|
|
22
|
-
constructor(..._args) { }
|
|
23
|
-
async reconcileSession(..._args) { }
|
|
24
|
-
async reconcileAll(..._args) { }
|
|
25
|
-
}
|
|
26
|
-
export function createRetiredAutomationLane() {
|
|
27
|
-
return { run: async () => { throw new Error('feature_retired'); } };
|
|
28
|
-
}
|
|
29
|
-
export function createRetiredChannelApiClient(..._args) {
|
|
30
|
-
return { listBindings: async (..._args) => ({ bindings: [] }) };
|
|
31
|
-
}
|
|
32
|
-
export function retiredDirectWeChat(..._args) {
|
|
33
|
-
return Promise.reject(new Error('feature_retired'));
|
|
34
|
-
}
|
|
35
|
-
export function splitExternalReplyText(text) {
|
|
36
|
-
return [text];
|
|
37
|
-
}
|
|
38
|
-
export function weChatChannelConversationId(name) {
|
|
39
|
-
return `retired:${name}`;
|
|
40
|
-
}
|
|
1
|
+
const n=async()=>{throw new Error("feature_retired")};class s{constructor(e,t,a){}async start(){}async stop(){}getManagerChannel(...e){return null}getManagerChannelStatus(...e){return null}getChannelStatusById(...e){return null}getChannelById(...e){}listManagerChannelStatuses(...e){return[]}listManagerExternalChannels(...e){return[]}listChannelIdsManagedBy(...e){return[]}getDefaultReplyTarget(...e){return n()}upsertManagerChannel(...e){return n()}upsertManagerWeChatRpaChannel(...e){return n()}syncManagerWeChatRpaChannel(...e){return n()}cancelManagerWeChatRpaOutbound(...e){return n()}deleteManagerWeChatRpaChannel(...e){return n()}reply(...e){return n()}}class u{constructor(...e){}async reconcileSession(...e){}async reconcileAll(...e){}}function g(){return{run:async()=>{throw new Error("feature_retired")}}}function l(...r){return{listBindings:async(...e)=>({bindings:[]})}}function i(...r){return Promise.reject(new Error("feature_retired"))}function o(r){return[r]}function c(r){return`retired:${r}`}export{s as RetiredChannelRuntime,u as RetiredWeChatRpaSessionBindingSync,g as createRetiredAutomationLane,l as createRetiredChannelApiClient,i as retiredDirectWeChat,o as splitExternalReplyText,c as weChatChannelConversationId};
|