agentworkshop 0.5.6 → 0.5.8
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/.AgentWorkShop/prompts/host-tools.json +31 -0
- package/.output/.AgentWorkShop/prompts/host-tools.json +31 -0
- package/.output/nitro.json +1 -1
- package/.output/public/_nuxt/builds/latest.json +1 -1
- package/.output/public/_nuxt/builds/meta/998b4cce-8563-44e5-b0ef-ff3d71a8480f.json +1 -0
- package/.output/server/chunks/_/nitro.mjs +835 -668
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs +5 -2
- package/.output/server/chunks/routes/api/workshop/agent-tools/invoke.post.mjs.map +1 -1
- package/.output/server/package.json +1 -1
- package/package.json +1 -1
- package/scripts/_dbg-cross-team-visibility-e2e.mjs +129 -0
- package/scripts/_dbg-overview-probe.sh +31 -0
- package/server/api/workshop/agent-tools/invoke.post.ts +8 -1
- package/server/data/daqs.json +91 -91
- package/server/data/dcw-lines.json +7 -0
- package/server/data/dcw-products.json +7 -0
- package/server/data/dcw-rollback.json +114 -1
- package/server/data/dcw-runs.json +27 -18
- package/server/data/dcw-writes.json +48 -0
- package/server/data/dcws.json +21 -0
- package/server/data/line-runs.json +23 -23
- package/server/services/workshop/agents/agent-interface.ts +20 -0
- package/server/services/workshop/agents/omp-agent.ts +28 -0
- package/server/services/workshop/db/memory.repo.ts +26 -0
- package/server/services/workshop/runtime/manager.ts +127 -0
- package/.output/public/_nuxt/builds/meta/d50c6ec2-801c-4ba2-97d8-a4db401b702c.json +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as defineApiHandler, o as readBody, n as createError, X as toolMyIndustrialNodes, Y as toolDcwControl, Z as toolDaqQuery, _ as toolDcwJudge, $ as toolDcwRollback, a0 as toolDcwJournal } from '../../../../_/nitro.mjs';
|
|
1
|
+
import { c as defineApiHandler, o as readBody, n as createError, g as getWorkshopManager, X as toolMyIndustrialNodes, Y as toolDcwControl, Z as toolDaqQuery, _ as toolDcwJudge, $ as toolDcwRollback, a0 as toolDcwJournal } from '../../../../_/nitro.mjs';
|
|
2
2
|
import { resolveUser } from '../caller.mjs';
|
|
3
3
|
import 'node:crypto';
|
|
4
4
|
import 'node:http';
|
|
@@ -15,6 +15,7 @@ import 'node:net';
|
|
|
15
15
|
import 'node:util';
|
|
16
16
|
import 'node:module';
|
|
17
17
|
|
|
18
|
+
const COLLAB_TOOLS = /* @__PURE__ */ new Set(["list_other_teams", "search_other_teams_memory", "send_cross_channel_message"]);
|
|
18
19
|
const invoke_post = defineApiHandler(async (event) => {
|
|
19
20
|
var _a, _b, _c, _d;
|
|
20
21
|
resolveUser(event);
|
|
@@ -24,7 +25,9 @@ const invoke_post = defineApiHandler(async (event) => {
|
|
|
24
25
|
const args = (_d = body.args) != null ? _d : {};
|
|
25
26
|
if (!agentId) throw createError({ statusCode: 400, statusMessage: "agentId required" });
|
|
26
27
|
let result;
|
|
27
|
-
if (tool
|
|
28
|
+
if (COLLAB_TOOLS.has(tool)) {
|
|
29
|
+
result = getWorkshopManager().invokeAgentWorkspaceTool(agentId, tool, args);
|
|
30
|
+
} else if (tool === "my_industrial_nodes") result = await toolMyIndustrialNodes(agentId);
|
|
28
31
|
else if (tool === "dcw_control") result = await toolDcwControl(agentId, args);
|
|
29
32
|
else if (tool === "daq_query") result = await toolDaqQuery(agentId, args);
|
|
30
33
|
else if (tool === "dcw_judge") result = await toolDcwJudge(agentId, args);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invoke.post.mjs","sources":["../../../../../../../server/api/workshop/agent-tools/invoke.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"invoke.post.mjs","sources":["../../../../../../../server/api/workshop/agent-tools/invoke.post.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAmBA,MAAA,+BAAA,IAAA,GAAA,CAAA,CAAA,kBAAA,EAAA,2BAAA,EAAA,4BAAA,CAAA,CAAA;AAEA,oBAAA,gBAAA,CAAA,OAAA,KAAA,KAAA;;AACA,EAAA,WAAA,CAAA,KAAA,CAAA;AACA,EAAA,MAAA,QAAA,EAAA,GAAA,MAAA,QAAA,CAAA,KAAA,CAAA,KAAA,YAAA,EAAA;AACA,EAAA,MAAA,OAAA,GAAA,MAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAA,OAAA,KAAA,YAAA,EAAA,CAAA;AACA,EAAA,MAAA,IAAA,GAAA,MAAA,CAAA,CAAA,EAAA,GAAA,IAAA,CAAA,IAAA,KAAA,YAAA,EAAA,CAAA;AACA,EAAA,MAAA,IAAA,GAAA,CAAA,EAAA,GAAA,IAAA,CAAA,IAAA,KAAA,IAAA,GAAA,EAAA,GAAA,EAAA;AACA,EAAA,IAAA,CAAA,SAAA,MAAA,WAAA,CAAA,EAAA,UAAA,EAAA,GAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,CAAA;AACA,EAAA,IAAA,MAAA;AACA,EAAA,IAAA,YAAA,CAAA,GAAA,CAAA,IAAA,CAAA,EAAA;AACA,IAAA,MAAA,GAAA,kBAAA,EAAA,CAAA,wBAAA,CAAA,OAAA,EAAA,MAAA,IAAA,CAAA;AAAA,EACA,WACA,IAAA,KAAA,qBAAA,EAAA,MAAA,GAAA,MAAA,sBAAA,OAAA,CAAA;AAAA,OAAA,IACA,SAAA,aAAA,EAAA,MAAA,GAAA,MAAA,cAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,WAAA,EAAA,MAAA,GAAA,MAAA,YAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,WAAA,EAAA,MAAA,GAAA,MAAA,YAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,cAAA,EAAA,MAAA,GAAA,MAAA,eAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OAAA,IACA,SAAA,aAAA,EAAA,MAAA,GAAA,MAAA,cAAA,CAAA,SAAA,IAAA,CAAA;AAAA,OACA,MAAA,YAAA,EAAA,UAAA,EAAA,KAAA,aAAA,EAAA,CAAA,cAAA,EAAA,IAAA,CAAA,CAAA,EAAA,CAAA;AACA,EAAA,OAAA,EAAA,MAAA,EAAA;AACA,CAAA,CAAA;;;;"}
|
package/package.json
CHANGED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 跨团队可见性端到端验证:leader 看其他团队任务场景(list_other_teams)、
|
|
3
|
+
* 全员查其他团队共享记忆(search_other_teams_memory)、权限反证(worker 查概览被拒)。
|
|
4
|
+
* 前置:运行中的环境(默认 3000)。运行: node scripts/_dbg-cross-team-visibility-e2e.mjs
|
|
5
|
+
*/
|
|
6
|
+
const ROOT = process.env.AW_BASE ?? 'http://127.0.0.1:3000'
|
|
7
|
+
let TOKEN = ''
|
|
8
|
+
const H = () => ({ authorization: `Bearer ${TOKEN}`, 'content-type': 'application/json' })
|
|
9
|
+
const sleep = (ms) => new Promise(r => setTimeout(r, ms))
|
|
10
|
+
let failures = 0
|
|
11
|
+
const check = (name, ok, detail = '') => {
|
|
12
|
+
console.log(` ${ok ? 'PASS' : 'FAIL'} ${name}${detail ? ` — ${detail}` : ''}`)
|
|
13
|
+
if (!ok) failures++
|
|
14
|
+
}
|
|
15
|
+
const fail = (m) => { console.error('FATAL:', m); process.exit(1) }
|
|
16
|
+
|
|
17
|
+
async function api(method, path, body) {
|
|
18
|
+
const res = await fetch(ROOT + path, { method, headers: H(), body: body !== undefined ? JSON.stringify(body) : undefined })
|
|
19
|
+
const json = await res.json().catch(() => ({}))
|
|
20
|
+
return { status: res.status, ...json }
|
|
21
|
+
}
|
|
22
|
+
const jpost = (u, b) => api('POST', u, b ?? {})
|
|
23
|
+
const jget = (u) => api('GET', u)
|
|
24
|
+
const invoke = async (agentId, tool, args = {}) => {
|
|
25
|
+
const r = await jpost('/api/workshop/agent-tools/invoke', { agentId, tool, args })
|
|
26
|
+
const result = r.data?.result
|
|
27
|
+
return { status: r.status, text: String(result?.text ?? JSON.stringify(r).slice(0, 200)), isError: result?.isError === true }
|
|
28
|
+
}
|
|
29
|
+
const cleanup = []
|
|
30
|
+
const tag = Math.random().toString(36).slice(2, 8)
|
|
31
|
+
|
|
32
|
+
async function deployTeam(name, withWorker) {
|
|
33
|
+
const chRes = (await jpost('/api/workshop/channels', { name, description: '跨团队可见性验证' })).data
|
|
34
|
+
cleanup.push(['channel', chRes.channelId])
|
|
35
|
+
const team = (await jpost('/api/workshop/teams', { name: name + '-组', description: '跨团队可见性验证' })).data
|
|
36
|
+
cleanup.push(['team', team.id])
|
|
37
|
+
await jpost(`/api/workshop/teams/${team.id}/members`, { agentId: 'tpl-default-lead', role: 'lead' })
|
|
38
|
+
let worker = null
|
|
39
|
+
if (withWorker) {
|
|
40
|
+
const tpl = (await jpost('/api/workshop/agents', { name: name + '-worker', harness: 'mock', config: {} })).data
|
|
41
|
+
cleanup.push(['agent-tpl', tpl.id])
|
|
42
|
+
await jpost(`/api/workshop/teams/${team.id}/members`, { agentId: tpl.id, role: 'worker' })
|
|
43
|
+
}
|
|
44
|
+
await jpost(`/api/workshop/teams/${team.id}/deploy`, { channelId: chRes.channelId })
|
|
45
|
+
const agents = (await jget(`/api/workshop/channels/${chRes.channelId}/agents`)).data
|
|
46
|
+
const lead = agents.find(a => a.role === 'lead')
|
|
47
|
+
worker = agents.find(a => a.role === 'worker') ?? null
|
|
48
|
+
if (lead) cleanup.push(['channel-agent', `${chRes.channelId}:${lead.id}`])
|
|
49
|
+
if (worker) cleanup.push(['channel-agent', `${chRes.channelId}:${worker.id}`])
|
|
50
|
+
return { channelId: chRes.channelId, lead, worker }
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function main() {
|
|
54
|
+
console.log('━━━ 0. 注册与双团队部署 ━━━')
|
|
55
|
+
const reg = await jpost('/api/workshop/users/register', { name: 'xvis-' + tag })
|
|
56
|
+
TOKEN = reg.data?.token
|
|
57
|
+
if (!TOKEN) fail('注册失败: ' + JSON.stringify(reg).slice(0, 120))
|
|
58
|
+
check('注册并取得 token', !!TOKEN)
|
|
59
|
+
const east = await deployTeam('东线团队-' + tag, false)
|
|
60
|
+
const west = await deployTeam('西线团队-' + tag, true)
|
|
61
|
+
check('东线(无 worker)+ 西线(含 worker)就绪', !!east.lead?.id && !!west.lead?.id && !!west.worker?.id,
|
|
62
|
+
`eastLead=${String(east.lead?.id ?? '').slice(0, 8)} westLead=${String(west.lead?.id ?? '').slice(0, 8)}`)
|
|
63
|
+
|
|
64
|
+
// ===== 1. 东线沉淀共享记忆(他人将检索的知识)=====
|
|
65
|
+
console.log('\n━━━ 1. 东线共享记忆沉淀 ━━━')
|
|
66
|
+
const mem = await jpost(`/api/workshop/channels/${east.channelId}/memories`, {
|
|
67
|
+
title: '淬火工艺结论-' + tag,
|
|
68
|
+
content: `东线团队完成淬火工序验证:淬火温度 182℃ 保温 30 分钟后硬度达标 HRC58,温度超过 190℃ 会出现过回火软化。结论可用于西线同类工件工艺制定(${tag})。`,
|
|
69
|
+
importance: 0.9,
|
|
70
|
+
})
|
|
71
|
+
check('东线共享记忆写入', mem.status === 200, `status=${mem.status}`)
|
|
72
|
+
|
|
73
|
+
// ===== 2. 东线创建进行中场景任务 =====
|
|
74
|
+
console.log('\n━━━ 2. 东线进行中任务 ━━━')
|
|
75
|
+
const task = await jpost(`/api/workshop/channels/${east.channelId}/tasks`, {
|
|
76
|
+
title: '东线批次复检-' + tag,
|
|
77
|
+
parts: [{ text: '对当前批次做复检并记录结论' }],
|
|
78
|
+
})
|
|
79
|
+
const taskId = task.data?.task?.id ?? task.data?.id
|
|
80
|
+
cleanup.push(['task', taskId])
|
|
81
|
+
check('东线任务创建(进行中)', !!taskId, `id=${String(taskId ?? '').slice(0, 8)}`)
|
|
82
|
+
|
|
83
|
+
// ===== 3. 西线 lead:list_other_teams 看到东线的任务场景 =====
|
|
84
|
+
console.log('\n━━━ 3. Leader 跨团队观察面 ━━━')
|
|
85
|
+
const ov = await invoke(west.lead.id, 'list_other_teams')
|
|
86
|
+
const ovText = String(ov.text ?? '')
|
|
87
|
+
check('lead 查看其他团队概览', ov.status === 200 && ovText.includes('东线团队-' + tag), `status=${ov.status}`)
|
|
88
|
+
check('概览包含东线进行中任务标题', ovText.includes('东线批次复检-' + tag))
|
|
89
|
+
check('概览包含东线近期完成记录', ovText.includes('近期完成'))
|
|
90
|
+
|
|
91
|
+
// ===== 4. 西线 worker:search_other_teams_memory 查到东线共享知识 =====
|
|
92
|
+
console.log('\n━━━ 4. Worker 跨团队记忆检索 ━━━')
|
|
93
|
+
const hit = await invoke(west.worker.id, 'search_other_teams_memory', { query: '淬火 温度 硬度', limit: 5 })
|
|
94
|
+
const hitText = String(hit.text ?? '')
|
|
95
|
+
check('worker 检索到东线共享记忆', hit.status === 200 && hitText.includes('淬火工艺结论-' + tag),
|
|
96
|
+
`status=${hit.status} text=${hitText.slice(0, 60)}`)
|
|
97
|
+
check('检索结果带团队归属', hitText.includes('东线团队-' + tag))
|
|
98
|
+
|
|
99
|
+
// ===== 5. 权限反证:worker 查任务概览被拒(仅 lead)=====
|
|
100
|
+
const denied = await invoke(west.worker.id, 'list_other_teams')
|
|
101
|
+
check('worker 查任务概览被拒(仅 lead)', denied.isError === true || denied.status === 403 || String(denied.text ?? '').includes('Leader'),
|
|
102
|
+
`status=${denied.status} text=${String(denied.text ?? '').slice(0, 60)}`)
|
|
103
|
+
|
|
104
|
+
// ===== 6. 工作流语义:知识已存在 → lead 直接复用,无需发信 =====
|
|
105
|
+
const reuse = hitText.includes('182') && hitText.includes('HRC58')
|
|
106
|
+
check('跨团队知识可复用(检索内容含结论数值)', reuse)
|
|
107
|
+
console.log(' (工作流:命中知识 → 直接复用;未命中但有相关任务 → lead 用 send_cross_channel_message 发信请求协作)')
|
|
108
|
+
|
|
109
|
+
// ===== 清理 =====
|
|
110
|
+
console.log('\n━━━ 清理 ━━━')
|
|
111
|
+
for (const [kind, id] of [...cleanup].reverse()) {
|
|
112
|
+
try {
|
|
113
|
+
if (kind === 'channel') await api('DELETE', `/api/workshop/channels/${id}`)
|
|
114
|
+
else if (kind === 'team') await api('DELETE', `/api/workshop/teams/${id}`)
|
|
115
|
+
else if (kind === 'agent-tpl') await api('DELETE', `/api/workshop/agents/${id}`)
|
|
116
|
+
else if (kind === 'channel-agent') {
|
|
117
|
+
const [cid, aid] = String(id).split(':')
|
|
118
|
+
if (cid && aid) await api('DELETE', `/api/workshop/channels/${cid}/agents/${aid}`)
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch { /* 清理失败不阻断 */ }
|
|
122
|
+
}
|
|
123
|
+
console.log('清理完成')
|
|
124
|
+
|
|
125
|
+
console.log(failures === 0 ? '\nE2E ALL PASS' : `\nE2E ${failures} FAILED`)
|
|
126
|
+
if (failures > 0) process.exit(1)
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
main().catch((e) => { console.error(e); process.exit(1) })
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# 自包含探针(同主两团队):东线(含共享记忆)+ 西线 → 西线 lead 的 list_other_teams
|
|
3
|
+
set -e
|
|
4
|
+
B=http://127.0.0.1:3000/api/workshop
|
|
5
|
+
STAMP=$(date +%s)
|
|
6
|
+
TA=$(curl -s --noproxy 127.0.0.1 -X POST $B/users/register -H "content-type: application/json" -d "{\"name\":\"ovw2-a-$STAMP\"}" | python -c "import json,sys;print(json.load(sys.stdin)['data']['token'])")
|
|
7
|
+
AA="authorization: Bearer $TA"
|
|
8
|
+
|
|
9
|
+
# 东线团队(含共享记忆)
|
|
10
|
+
CHA=$(curl -s --noproxy 127.0.0.1 -X POST $B/channels -H "$AA" -H "content-type: application/json" -d "{\"name\":\"东线团队-$STAMP\"}" | python -c "import json,sys;print(json.load(sys.stdin)['data']['channelId'])")
|
|
11
|
+
TEA=$(curl -s --noproxy 127.0.0.1 -X POST $B/teams -H "$AA" -H "content-type: application/json" -d "{\"name\":\"东线组-$STAMP\"}" | python -c "import json,sys;print(json.load(sys.stdin)['data']['id'])")
|
|
12
|
+
curl -s --noproxy 127.0.0.1 -X POST "$B/teams/$TEA/members" -H "$AA" -H "content-type: application/json" -d '{"agentId":"tpl-default-lead","role":"lead"}' > /dev/null
|
|
13
|
+
curl -s --noproxy 127.0.0.1 -X POST "$B/teams/$TEA/deploy" -H "$AA" -H "content-type: application/json" -d "{\"channelId\":\"$CHA\"}" > /dev/null
|
|
14
|
+
curl -s --noproxy 127.0.0.1 -X POST "$B/channels/$CHA/memories" -H "$AA" -H "content-type: application/json" -d '{"title":"东线工艺结论","content":"淬火 182℃ 保温 30 分钟硬度达标 HRC58","importance":0.9}' > /dev/null
|
|
15
|
+
|
|
16
|
+
# 西线团队(观察视角)
|
|
17
|
+
CHB=$(curl -s --noproxy 127.0.0.1 -X POST $B/channels -H "$AA" -H "content-type: application/json" -d "{\"name\":\"西线团队-$STAMP\"}" | python -c "import json,sys;print(json.load(sys.stdin)['data']['channelId'])")
|
|
18
|
+
TEB=$(curl -s --noproxy 127.0.0.1 -X POST $B/teams -H "$AA" -H "content-type: application/json" -d "{\"name\":\"西线组-$STAMP\"}" | python -c "import json,sys;print(json.load(sys.stdin)['data']['id'])")
|
|
19
|
+
curl -s --noproxy 127.0.0.1 -X POST "$B/teams/$TEB/members" -H "$AA" -H "content-type: application/json" -d '{"agentId":"tpl-default-lead","role":"lead"}' > /dev/null
|
|
20
|
+
curl -s --noproxy 127.0.0.1 -X POST "$B/teams/$TEB/deploy" -H "$AA" -H "content-type: application/json" -d "{\"channelId\":\"$CHB\"}" > /dev/null
|
|
21
|
+
LEADB=$(curl -s --noproxy 127.0.0.1 "$B/channels/$CHB/agents" -H "$AA" | python -c "import json,sys;print([a['id'] for a in json.load(sys.stdin)['data'] if a['role']=='lead'][0])")
|
|
22
|
+
|
|
23
|
+
echo "--- 西线 lead 视角 list_other_teams ---"
|
|
24
|
+
curl -s --noproxy 127.0.0.1 -X POST $B/agent-tools/invoke -H "$AA" -H "content-type: application/json" \
|
|
25
|
+
-d "{\"agentId\":\"$LEADB\",\"tool\":\"list_other_teams\",\"args\":{}}" \
|
|
26
|
+
| python -c "import json,sys;print(json.load(sys.stdin)['data']['result']['text'])"
|
|
27
|
+
echo "--- 东线 lead 视角 search_other_teams_memory(本例只有东线,预期空)---"
|
|
28
|
+
LEADA=$(curl -s --noproxy 127.0.0.1 "$B/channels/$CHA/agents" -H "$AA" | python -c "import json,sys;print([a['id'] for a in json.load(sys.stdin)['data'] if a['role']=='lead'][0])")
|
|
29
|
+
curl -s --noproxy 127.0.0.1 -X POST $B/agent-tools/invoke -H "$AA" -H "content-type: application/json" \
|
|
30
|
+
-d "{\"agentId\":\"$LEADA\",\"tool\":\"search_other_teams_memory\",\"args\":{\"query\":\"淬火\"}}" \
|
|
31
|
+
| python -c "import json,sys;print(json.load(sys.stdin)['data']['result']['text'])"
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
import { readBody } from 'h3'
|
|
7
7
|
import { resolveUser } from '@/server/api/workshop/caller'
|
|
8
8
|
import { defineApiHandler } from '@/server/utils/response'
|
|
9
|
+
import { getWorkshopManager } from '@/server/plugins/workshop'
|
|
9
10
|
import {
|
|
10
11
|
toolDaqQuery,
|
|
11
12
|
toolDcwControl,
|
|
@@ -15,6 +16,9 @@ import {
|
|
|
15
16
|
toolMyIndustrialNodes,
|
|
16
17
|
} from '@/server/services/workshop/agents/industrial-tools'
|
|
17
18
|
|
|
19
|
+
/** 协作工具族:经 manager 工具桥落到 agent workspace(跨团队可见性/跨 Channel 通信) */
|
|
20
|
+
const COLLAB_TOOLS = new Set(['list_other_teams', 'search_other_teams_memory', 'send_cross_channel_message'])
|
|
21
|
+
|
|
18
22
|
export default defineApiHandler(async (event) => {
|
|
19
23
|
resolveUser(event)
|
|
20
24
|
const body = await readBody<{ agentId?: string, tool?: string, args?: Record<string, unknown> }>(event) ?? {}
|
|
@@ -23,7 +27,10 @@ export default defineApiHandler(async (event) => {
|
|
|
23
27
|
const args = body.args ?? {}
|
|
24
28
|
if (!agentId) throw createError({ statusCode: 400, statusMessage: 'agentId required' })
|
|
25
29
|
let result: { text: string, isError?: boolean }
|
|
26
|
-
if (tool
|
|
30
|
+
if (COLLAB_TOOLS.has(tool)) {
|
|
31
|
+
result = getWorkshopManager().invokeAgentWorkspaceTool(agentId, tool, args)
|
|
32
|
+
}
|
|
33
|
+
else if (tool === 'my_industrial_nodes') result = await toolMyIndustrialNodes(agentId)
|
|
27
34
|
else if (tool === 'dcw_control') result = await toolDcwControl(agentId, args as { node_id?: string, value?: number, hypothesis?: string, task_id?: string })
|
|
28
35
|
else if (tool === 'daq_query') result = await toolDaqQuery(agentId, args as Parameters<typeof toolDaqQuery>[1])
|
|
29
36
|
else if (tool === 'dcw_judge') result = await toolDcwJudge(agentId, args as { record_id?: string, verdict?: string, reason?: string })
|