dsh-aris-panel 0.1.2 → 0.1.4
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/dsh/client.js +121 -39
- package/dsh/workbench.mjs +20 -1
- package/package.json +1 -1
package/dsh/client.js
CHANGED
|
@@ -222,52 +222,51 @@ function inferStage(ov) {
|
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
const WORKFLOW_CHIPS = [
|
|
225
|
-
{ num: 'W1', label: 'Idea Discovery 想法发现', entry: 'idea-discovery', desc: '
|
|
226
|
-
{ num: 'W1.5', label: 'Experiment Bridge 实验桥接', entry: 'experiment-bridge', desc: '
|
|
227
|
-
{ num: 'W2', label: 'Auto Review Loop
|
|
228
|
-
{ num: 'W3', label: 'Paper Writing 论文写作', entry: 'paper-writing', desc: '
|
|
229
|
-
{ num: 'W4', label: 'Rebuttal 回复审稿', entry: 'rebuttal', desc: '
|
|
230
|
-
{ num: 'W5', label: 'Resubmit 换会重投', entry: 'resubmit-pipeline', desc: '
|
|
231
|
-
{ num: 'W6', label: 'Conference Talk 会议演讲', entry: 'paper-talk', desc: '
|
|
225
|
+
{ num: 'W1', label: 'Idea Discovery 想法发现', entry: 'idea-discovery', desc: '完整想法发现管线:多源文献调研 → 头脑风暴 8-12 个具体想法 → 可行性与算力过滤 → 深度新颖性验证 + 魔鬼代言人审 → top 2-3 想法并行 GPU 试跑(30min-2h) → 按实验信号排名 → 精炼出问题锚定提案 → claim 驱动的实验路线图。产出 IDEA_REPORT.md 排名报告 + FINAL_PROPOSAL + EXPERIMENT_PLAN。' },
|
|
226
|
+
{ num: 'W1.5', label: 'Experiment Bridge 实验桥接', entry: 'experiment-bridge', desc: '把实验计划变成运行结果:解析 EXPERIMENT_PLAN.md → 实现实验代码(带 argparse/日志/种子) → GPT-5.6-Sol 审代码抓逻辑 bug → 最小实验 sanity check → 部署 GPU 跑全套 → 收集结果更新实验追踪。' },
|
|
227
|
+
{ num: 'W2', label: 'Auto Review Loop 自动审稿循环', entry: 'auto-review-loop', desc: '无人值守审稿循环:外部审稿人深审论文/claims/实验指出弱点 → 自动修复(重写章节/加 baseline/补实验) → 重新评估,循环直到 ≥6/10 或 4 轮上限;>4 GPU 小时的实验自动跳过并标记人工跟进,断点可从 REVIEW_STATE.json 恢复。' },
|
|
228
|
+
{ num: 'W3', label: 'Paper Writing 论文写作', entry: 'paper-writing', desc: '从叙事报告到可投稿 PDF:claims-evidence 矩阵 + 章节规划 → 数据驱动图表 → 逐节 LaTeX → 编译 PDF 修错 + 页数检查 → 两轮外部内容审 + 最终格式检查。' },
|
|
229
|
+
{ num: 'W4', label: 'Rebuttal 回复审稿', entry: 'rebuttal', desc: '安全回复审稿意见:解析意见拆成 issue 卡片 → 全局策略 + 逐审稿人优先级 → 可选自动补实验 → 起草回复 → 6 项安全检查(覆盖/溯源/承诺/语气/一致性/字数) → GPT 压力测试 → 输出限字版 + 富文本版。' },
|
|
230
|
+
{ num: 'W5', label: 'Resubmit 换会重投', entry: 'resubmit-pipeline', desc: '换会议重投:硬约束(不加实验/不改 bib/不改框架/不覆盖旧稿) → 物理隔离 + 5 层匿名检查 → 白名单微编辑 → kill-argument 对抗门 → RESUBMIT_REPORT 七态账本。' },
|
|
231
|
+
{ num: 'W6', label: 'Conference Talk 会议演讲', entry: 'paper-talk', desc: '从论文到会议演讲:演讲大纲 → Beamer + PPTX + 讲稿 + Q&A 准备 → 逐页打磨 → claim/citation/匿名审计门。' },
|
|
232
232
|
]
|
|
233
233
|
const AUDIT_CHIPS = [
|
|
234
|
-
{ label: '实验诚实度审计', skill: 'experiment-audit', desc: 'eval
|
|
235
|
-
{ label: '结果→声明判定', skill: 'result-to-claim', desc: '
|
|
236
|
-
{ label: '论文数字核对', skill: 'paper-claim-audit', desc: '
|
|
237
|
-
{ label: '引用真实性审计', skill: 'citation-audit', desc: '
|
|
238
|
-
{ label: '最强拒稿模拟', skill: 'kill-argument', desc: '200
|
|
234
|
+
{ label: '实验诚实度审计', skill: 'experiment-audit', desc: '审计 eval 代码是否诚实:检查是否有假 ground truth、分数自归一化、幻影结果、范围不足——结果可信前必跑。' },
|
|
235
|
+
{ label: '结果→声明判定', skill: 'result-to-claim', desc: '判定结果支持什么:Codex 评估实验对既定 claims 的支持度,路由下一步(转向/补充/确认),实验完成后、写论文前跑。' },
|
|
236
|
+
{ label: '论文数字核对', skill: 'paper-claim-audit', desc: '核对论文数字:零上下文审稿人核对每个数字/比较/范围声明是否与原始结果一致,防止确认偏差。' },
|
|
237
|
+
{ label: '引用真实性审计', skill: 'citation-audit', desc: '审计每条引用:文献必须真实存在、归属正确、上下文确实支持——抓幻觉作者/错年份/假 venue/错上下文。' },
|
|
238
|
+
{ label: '最强拒稿模拟', skill: 'kill-argument', desc: '拒稿压力测试:新审稿人写 200 词最强拒稿信,第二名独立审稿人逐点辩护并暴露仍未解决的关键问题。' },
|
|
239
239
|
]
|
|
240
240
|
const MEMORY_CHIPS = [
|
|
241
|
-
{ label: 'research-wiki 知识库', skill: 'research-wiki', desc: '
|
|
242
|
-
{ label: 'wiki 补全', skill: 'wiki-enrich', desc: '
|
|
243
|
-
{ label: 'meta-optimize 自我优化', skill: 'meta-optimize', desc: '
|
|
241
|
+
{ label: 'research-wiki 知识库', skill: 'research-wiki', desc: '跨会话研究记忆:论文/想法/实验/声明四类实体 + 图谱边;失败想法成为反重复记忆,下次构思自动避开踩过的坑。' },
|
|
242
|
+
{ label: 'wiki 补全', skill: 'wiki-enrich', desc: '补全 research-wiki 的论文页 TODO 区,把批量导入留下的骨架填充成完整摘要。' },
|
|
243
|
+
{ label: 'meta-optimize 自我优化', skill: 'meta-optimize', desc: 'ARIS 自我优化:分析 .aris/meta 使用日志,提议改进 SKILL.md 与工作流默认值,改动需审稿门控 + 人工批准。' },
|
|
244
244
|
]
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
},
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
}))
|
|
245
|
+
function WbPanoCard(props) {
|
|
246
|
+
const it = props.item
|
|
247
|
+
const entry = it.skill || it.entry
|
|
248
|
+
return h('button', {
|
|
249
|
+
className: 'wb-pano-card',
|
|
250
|
+
onClick: function () { props.onPick(entry) },
|
|
251
|
+
title: it.desc || '',
|
|
252
|
+
},
|
|
253
|
+
h('div', { className: 'wb-pano-card-head' },
|
|
254
|
+
it.num ? h('span', { className: 'wb-pano-num' }, it.num) : null,
|
|
255
|
+
h('span', { className: 'wb-pano-card-title' }, it.label)),
|
|
256
|
+
it.desc ? h('div', { className: 'wb-pano-card-desc' }, it.desc) : null,
|
|
257
|
+
h('div', { className: 'wb-pano-card-entry' }, '入口: ' + entry))
|
|
258
258
|
}
|
|
259
259
|
|
|
260
260
|
function WbPanorama(props) {
|
|
261
261
|
return h('div', { className: 'wb-panorama' },
|
|
262
262
|
h('div', { className: 'wb-guide-title' }, '功能全景:7 个工作流 + 审计链 + 记忆(点击选项卡填充到下方技能触发)'),
|
|
263
|
-
h('div', { className: 'wb-pano-group' }, h('
|
|
264
|
-
h(
|
|
265
|
-
h('div', { className: 'wb-pano-group' }, h('
|
|
266
|
-
h(
|
|
267
|
-
h('div', { className: 'wb-pano-group' }, h('
|
|
268
|
-
h(
|
|
263
|
+
h('div', { className: 'wb-pano-group' }, h('div', { className: 'wb-pano-group-label' }, '工作流'),
|
|
264
|
+
h('div', { className: 'wb-pano-grid' }, WORKFLOW_CHIPS.map(function (it) { return h(WbPanoCard, { key: it.entry, item: it, onPick: props.onPick }) }))),
|
|
265
|
+
h('div', { className: 'wb-pano-group' }, h('div', { className: 'wb-pano-group-label' }, '审计链'),
|
|
266
|
+
h('div', { className: 'wb-pano-grid' }, AUDIT_CHIPS.map(function (it) { return h(WbPanoCard, { key: it.skill, item: it, onPick: props.onPick }) }))),
|
|
267
|
+
h('div', { className: 'wb-pano-group' }, h('div', { className: 'wb-pano-group-label' }, '记忆'),
|
|
268
|
+
h('div', { className: 'wb-pano-grid' }, MEMORY_CHIPS.map(function (it) { return h(WbPanoCard, { key: it.skill, item: it, onPick: props.onPick }) }))))
|
|
269
269
|
}
|
|
270
|
-
|
|
271
270
|
function WbGuide(props) {
|
|
272
271
|
const stage = props.stage
|
|
273
272
|
const onPick = props.onPick
|
|
@@ -301,7 +300,7 @@ function WbTrigger(props) {
|
|
|
301
300
|
const doLaunch = function () {
|
|
302
301
|
if (!skill) { setStatus('请先选择技能'); return }
|
|
303
302
|
setBusy(true)
|
|
304
|
-
connection.rpc.call(WB_CHANNEL, 'launch', { sessionId: sessionId, skill: skill, args: args })
|
|
303
|
+
connection.rpc.call(WB_CHANNEL, 'launch', { sessionId: sessionId, skill: skill, args: args, autoProceed: props.autoProceed })
|
|
305
304
|
.then(function (res) {
|
|
306
305
|
if (res.ok) {
|
|
307
306
|
setStatus(res.value.injected ? '已注入会话(' + res.value.method + '),执行已唤醒,请到会话窗口查看进度' : '未能注入,请复制提示词手动发送:' + res.value.prompt)
|
|
@@ -440,6 +439,9 @@ function ArisWorkbenchView(props) {
|
|
|
440
439
|
const [skillError, setSkillError] = React.useState(undefined)
|
|
441
440
|
const [skill, setSkill] = React.useState('')
|
|
442
441
|
const [args, setArgs] = React.useState('')
|
|
442
|
+
const [permPreset, setPermPreset] = React.useState('read-only')
|
|
443
|
+
const [autoProceed, setAutoProceed] = React.useState(true)
|
|
444
|
+
const [permStatus, setPermStatus] = React.useState(undefined)
|
|
443
445
|
|
|
444
446
|
React.useEffect(function () {
|
|
445
447
|
let live = true
|
|
@@ -530,9 +532,27 @@ function ArisWorkbenchView(props) {
|
|
|
530
532
|
if (error) children.push(h('div', { className: 'wb-error', key: 'err' }, error))
|
|
531
533
|
if (sessionId === undefined && workspaces === undefined) children.push(wbNote('正在连接工作区…'))
|
|
532
534
|
if (sessionId !== undefined) {
|
|
535
|
+
|
|
536
|
+
children.push(h('div', { className: 'wb-picker', key: 'pctl' },
|
|
537
|
+
h('label', null, '权限: '),
|
|
538
|
+
h('select', { className: 'wb-perm-select', value: permPreset, onChange: function (e) {
|
|
539
|
+
const v = e.target.value
|
|
540
|
+
setPermPreset(v)
|
|
541
|
+
connection.rpc.call(WB_CHANNEL, 'permission', { sessionId: sessionId, preset: v }).then(function (res) {
|
|
542
|
+
setPermStatus(res.ok ? '权限已设置: ' + v : (res.error ? res.error.message : '设置失败'))
|
|
543
|
+
}).catch(function (err) { setPermStatus('设置失败: ' + String(err)) })
|
|
544
|
+
} },
|
|
545
|
+
h('option', { value: 'read-only' }, 'Plan (只读)'),
|
|
546
|
+
h('option', { value: 'workspace-write' }, 'Accept Edits (可改文件)'),
|
|
547
|
+
h('option', { value: 'danger-full-access' }, 'Full Access (全自动)')),
|
|
548
|
+
h('label', null, '无人值守: '),
|
|
549
|
+
h('select', { className: 'wb-perm-select', value: autoProceed ? 'on' : 'off', onChange: function (e) { setAutoProceed(e.target.value === 'on') } },
|
|
550
|
+
h('option', { value: 'on' }, 'AUTO_PROCEED on (自动继续)'),
|
|
551
|
+
h('option', { value: 'off' }, 'AUTO_PROCEED off (每步确认)')),
|
|
552
|
+
permStatus ? h('span', { className: 'wb-perm-status' }, permStatus) : null))
|
|
533
553
|
children.push(h(WbPanorama, { key: 'pano', onPick: function (name) { setSkill(name) } }))
|
|
534
554
|
children.push(h(WbGuide, { key: 'guide', stage: stage, onPick: function (name) { setSkill(name) } }))
|
|
535
|
-
children.push(h(WbTrigger, { key: 'trigger', connection: connection, sessionId: sessionId, skills: skills, skill: skill, args: args, skillError: skillError, onSkill: setSkill, onArgs: setArgs }))
|
|
555
|
+
children.push(h(WbTrigger, { key: 'trigger', connection: connection, sessionId: sessionId, skills: skills, skill: skill, args: args, autoProceed: autoProceed, skillError: skillError, onSkill: setSkill, onArgs: setArgs }))
|
|
536
556
|
}
|
|
537
557
|
if (sessionId !== undefined && data === undefined && !error) children.push(wbNote('加载中…'))
|
|
538
558
|
if (data) {
|
|
@@ -566,13 +586,75 @@ function ArisWorkbenchButton(props) {
|
|
|
566
586
|
open ? h(ArisWorkbenchView, { connection: props.connection, sessions: props.sessions, sessionId: props.sessionId, onClose: function () { setOpen(false) } }) : null)
|
|
567
587
|
}
|
|
568
588
|
|
|
569
|
-
const WB_CSS = `.wb-
|
|
589
|
+
const WB_CSS = `.wb-overlay { position: fixed; inset: 0; z-index: 9999; background: #ffffff; color: #1f1f1f; padding: 20px 28px; overflow-y: auto; font-size: 13px; line-height: 1.6; font-family: ui-sans-serif, system-ui, sans-serif; }
|
|
590
|
+
.wb-header { display: flex; justify-content: space-between; align-items: center; border-bottom: 1px solid #e0e0e0; padding-bottom: 10px; margin-bottom: 14px; }
|
|
591
|
+
.wb-title { font-size: 17px; font-weight: 700; letter-spacing: .02em; color: #1f1f1f; }
|
|
592
|
+
.wb-actions { display: flex; gap: 8px; }
|
|
593
|
+
.wb-btn { background: #007acc; color: #fff; border: 0; border-radius: 4px; padding: 5px 14px; font-size: 12px; cursor: pointer; }
|
|
594
|
+
.wb-btn:disabled { opacity: .55; cursor: default; }
|
|
595
|
+
.wb-btn-close { background: #e8e8e8; color: #333333; }
|
|
596
|
+
.wb-btn-copy { background: #e8e8e8; color: #333333; }
|
|
597
|
+
.wb-picker { margin-bottom: 12px; }
|
|
598
|
+
.wb-picker label { color: #333333; }
|
|
599
|
+
.wb-picker select { background: #ffffff; color: #1f1f1f; border: 1px solid #c8c8c8; border-radius: 4px; padding: 4px 8px; font-size: 12px; max-width: 70%; }
|
|
600
|
+
.wb-section { margin-bottom: 20px; border: 1px solid #e4e4e4; border-radius: 6px; padding: 12px 16px; background: #fafafa; }
|
|
601
|
+
.wb-section h3 { margin: 0 0 10px; font-size: 12px; letter-spacing: .05em; text-transform: uppercase; opacity: .6; font-weight: 700; color: #1f1f1f; }
|
|
602
|
+
.wb-row { display: flex; gap: 12px; padding: 2px 0; }
|
|
603
|
+
.wb-key { flex: 0 0 150px; opacity: .7; }
|
|
604
|
+
.wb-val { flex: 1; word-break: break-word; }
|
|
605
|
+
.wb-note { opacity: .55; font-size: 12px; margin: 6px 0; }
|
|
606
|
+
.wb-list { margin: 6px 0; padding-left: 18px; }
|
|
607
|
+
.wb-list li { padding: 1px 0; font-size: 12px; }
|
|
608
|
+
.wb-dot-ok { color: #107c10; }
|
|
609
|
+
.wb-dot-missing { opacity: .35; }
|
|
610
|
+
.wb-error { color: #c42b1c; background: #fdeeee; border: 1px solid #e5b9b5; border-radius: 6px; padding: 8px 12px; margin: 10px 0; font-size: 12px; }
|
|
611
|
+
.wb-pre { background: #f5f5f5; border-radius: 4px; padding: 8px 10px; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 11px; white-space: pre-wrap; word-break: break-word; max-height: 180px; overflow-y: auto; margin: 6px 0; color: #24292e; }
|
|
612
|
+
.wb-file { margin: 6px 0; }
|
|
613
|
+
.wb-file-name { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; color: #0066b8; }
|
|
614
|
+
.wb-meta { opacity: .55; font-size: 11px; margin-left: 8px; }
|
|
615
|
+
.wb-sidebar-entry { padding: 4px 6px; }
|
|
616
|
+
.wb-sidebar-toggle { width: 100%; background: transparent; color: inherit; border: 1px solid transparent; border-radius: 4px; padding: 5px 8px; font-size: 12px; cursor: pointer; text-align: left; }
|
|
617
|
+
.wb-sidebar-toggle:hover { background: rgba(0,0,0,.06); border-color: rgba(0,0,0,.12); }
|
|
618
|
+
.wb-badge { display: inline-block; border-radius: 10px; padding: 1px 8px; font-size: 10px; margin-left: 6px; background: #e8e8e8; border: 1px solid #d0d0d0; color: #1f1f1f; }
|
|
619
|
+
.wb-guide { margin-bottom: 18px; border: 1px solid #e0e0e0; border-radius: 6px; padding: 12px 16px; background: #f7f7f7; }
|
|
620
|
+
.wb-guide-title { font-size: 13px; font-weight: 700; margin-bottom: 10px; color: #1f1f1f; }
|
|
621
|
+
.wb-stages { display: grid; grid-template-columns: repeat(auto-fill, minmax(280px, 1fr)); gap: 10px; }
|
|
622
|
+
.wb-stage { border: 1px solid #e6e6e6; border-radius: 6px; padding: 8px 10px; opacity: .55; background: #ffffff; }
|
|
623
|
+
.wb-stage-done { opacity: .8; }
|
|
624
|
+
.wb-stage-cur { opacity: 1; border-color: #007acc; background: #e8f4ff; }
|
|
625
|
+
.wb-stage-head { display: flex; align-items: center; gap: 8px; margin-bottom: 4px; }
|
|
626
|
+
.wb-stage-mark { flex: 0 0 20px; height: 20px; line-height: 20px; text-align: center; border-radius: 50%; background: #e8e8e8; font-size: 11px; color: #1f1f1f; }
|
|
627
|
+
.wb-stage-done .wb-stage-mark { background: #107c10; color: #ffffff; }
|
|
628
|
+
.wb-stage-cur .wb-stage-mark { background: #007acc; color: #ffffff; }
|
|
629
|
+
.wb-stage-title { font-size: 13px; font-weight: 600; }
|
|
630
|
+
.wb-stage-desc { font-size: 11px; opacity: .7; margin-bottom: 6px; }
|
|
631
|
+
.wb-stage-skills { display: flex; flex-wrap: wrap; gap: 6px; }
|
|
632
|
+
.wb-skill-chip { background: #eef4fb; color: #0066b8; border: 1px solid #99c9f0; border-radius: 12px; padding: 2px 10px; font-size: 11px; cursor: pointer; }
|
|
633
|
+
.wb-skill-chip:hover { background: #007acc; color: #ffffff; }
|
|
634
|
+
.wb-guide-next { margin-top: 10px; font-size: 12px; opacity: .85; }
|
|
635
|
+
.wb-trigger { margin-bottom: 18px; border: 1px solid #e0e0e0; border-radius: 6px; padding: 12px 16px; background: #f7f7f7; }
|
|
636
|
+
.wb-trigger-row { display: flex; gap: 10px; margin-bottom: 8px; flex-wrap: wrap; }
|
|
637
|
+
.wb-skill-select { flex: 1 1 420px; background: #ffffff; color: #1f1f1f; border: 1px solid #c8c8c8; border-radius: 4px; padding: 6px 10px; font-size: 12px; min-width: 260px; }
|
|
638
|
+
.wb-args { flex: 1 1 280px; background: #ffffff; color: #1f1f1f; border: 1px solid #c8c8c8; border-radius: 4px; padding: 6px 10px; font-size: 12px; min-width: 200px; }
|
|
639
|
+
.wb-status { font-size: 12px; color: #107c10; margin-top: 4px; }.wb-panorama { margin-bottom: 18px; border: 1px solid #e0e0e0; border-radius: 6px; padding: 12px 16px; background: #f7f7f7; }
|
|
570
640
|
.wb-pano-group { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
|
|
571
641
|
.wb-pano-group-label { font-size: 11px; letter-spacing: .06em; text-transform: uppercase; opacity: .55; font-weight: 700; flex: 0 0 44px; }
|
|
572
642
|
.wb-chip-row { display: flex; flex-wrap: wrap; gap: 6px; flex: 1; }
|
|
573
643
|
.wb-pano-chip { background: #ffffff; color: #1f1f1f; border: 1px solid #d0d0d0; border-radius: 14px; padding: 3px 12px; font-size: 12px; cursor: pointer; display: inline-flex; align-items: center; gap: 5px; }
|
|
574
644
|
.wb-pano-chip:hover { border-color: #007acc; color: #007acc; background: #eef4fb; }
|
|
575
|
-
.wb-pano-num { font-weight: 800; color: #007acc; font-size: 11px; }
|
|
645
|
+
.wb-pano-num { font-weight: 800; color: #007acc; font-size: 11px; }.wb-pano-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(250px, 1fr)); gap: 8px; flex: 1; }
|
|
646
|
+
.wb-pano-card { text-align: left; background: #ffffff; border: 1px solid #d0d0d0; border-radius: 8px; padding: 10px 12px; cursor: pointer; display: flex; flex-direction: column; gap: 4px; }
|
|
647
|
+
.wb-pano-card:hover { border-color: #007acc; background: #eef4fb; }
|
|
648
|
+
.wb-pano-card-head { display: flex; align-items: baseline; gap: 6px; }
|
|
649
|
+
.wb-pano-num { font-weight: 800; color: #007acc; font-size: 12px; }
|
|
650
|
+
.wb-pano-card-title { font-size: 13px; font-weight: 600; }
|
|
651
|
+
.wb-pano-card-desc { font-size: 11px; opacity: .75; line-height: 1.45; }
|
|
652
|
+
.wb-pano-card-entry { font-size: 11px; color: #0066b8; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }.wb-perm-select { background: #ffffff; color: #1f1f1f; border: 1px solid #c8c8c8; border-radius: 4px; padding: 3px 8px; font-size: 12px; margin-right: 12px; }
|
|
653
|
+
.wb-perm-status { font-size: 11px; color: #107c10; margin-left: 6px; }
|
|
654
|
+
|
|
655
|
+
.wb-pano-card { min-height: 158px; padding: 12px 14px; }
|
|
656
|
+
.wb-pano-card-desc { line-height: 1.55; }
|
|
657
|
+
`
|
|
576
658
|
|
|
577
659
|
const CSS = `
|
|
578
660
|
.aris-view { padding: 16px 20px; overflow-y: auto; font-size: 13px; line-height: 1.6; }
|
package/dsh/workbench.mjs
CHANGED
|
@@ -204,6 +204,23 @@ export function registerWorkbench(ctx) {
|
|
|
204
204
|
if (typeof sessionId !== 'string') {
|
|
205
205
|
return { ok: false, error: { code: 'bad-request', message: 'sessionId is required', details: {} } }
|
|
206
206
|
}
|
|
207
|
+
if (endpoint === 'permission') {
|
|
208
|
+
const preset = typeof payload === 'object' && payload !== null ? payload.preset : undefined
|
|
209
|
+
const allowed = ['read-only', 'workspace-write', 'danger-full-access']
|
|
210
|
+
if (typeof preset !== 'string' || allowed.indexOf(preset) === -1) {
|
|
211
|
+
return { ok: false, error: { code: 'bad-request', message: 'preset must be one of ' + allowed.join(', '), details: {} } }
|
|
212
|
+
}
|
|
213
|
+
try {
|
|
214
|
+
const session = scoped.sessions.get(sessionId)
|
|
215
|
+
if (!session || typeof session.append !== 'function') {
|
|
216
|
+
return { ok: false, error: { code: 'internal', message: 'session unavailable', details: {} } }
|
|
217
|
+
}
|
|
218
|
+
session.append('permission/preset', { preset: preset })
|
|
219
|
+
return { ok: true, value: { preset: preset } }
|
|
220
|
+
} catch (error) {
|
|
221
|
+
return { ok: false, error: { code: 'internal', message: String(error && error.message || error), details: {} } }
|
|
222
|
+
}
|
|
223
|
+
}
|
|
207
224
|
const workspace = scoped.sessions.get(sessionId)?.header?.cwd
|
|
208
225
|
if (typeof workspace !== 'string' || !isAbsolute(workspace)) {
|
|
209
226
|
return { ok: true, value: { workspace: undefined } }
|
|
@@ -246,7 +263,9 @@ export function registerWorkbench(ctx) {
|
|
|
246
263
|
return { ok: false, error: { code: 'bad-request', message: 'skill is required', details: {} } }
|
|
247
264
|
}
|
|
248
265
|
const argText = typeof args === 'string' && args.trim() !== '' ? ' 参数/方向:' + args.trim() : ''
|
|
249
|
-
const
|
|
266
|
+
const autoProceed = typeof payload === 'object' && payload !== null ? payload.autoProceed : undefined
|
|
267
|
+
const autoText = autoProceed === false ? ' 请将 AUTO_PROCEED 设为 false,在每个选择点停下来等我确认。' : (autoProceed === true ? ' 请将 AUTO_PROCEED 设为 true,自动继续、无人值守。' : '')
|
|
268
|
+
const prompt = '请使用 ARIS 技能 ' + TICK + skill + TICK + ' 完成对应工作流。' + argText + autoText
|
|
250
269
|
const messageId = 'aris-launch-' + Date.now() + '-' + Math.random().toString(36).slice(2, 8)
|
|
251
270
|
const message = {
|
|
252
271
|
id: messageId,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-aris-panel",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "ARIS research-workflow skills + interactive workbench panel for DeepSeek Harness (user fork of dsh-aris: 82 skills, cross-model Codex review, idea/workflow launcher, research status board).",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|