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 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: '文献→头脑风暴→新颖性→GPU试跑→排名' },
226
- { num: 'W1.5', label: 'Experiment Bridge 实验桥接', entry: 'experiment-bridge', desc: '计划→实现→审代码→部署→收集' },
227
- { num: 'W2', label: 'Auto Review Loop 自动审稿', entry: 'auto-review-loop', desc: '审→修→再审直到≥6分或4' },
228
- { num: 'W3', label: 'Paper Writing 论文写作', entry: 'paper-writing', desc: '叙事→大纲→图表→LaTeX→PDF→外部审' },
229
- { num: 'W4', label: 'Rebuttal 回复审稿', entry: 'rebuttal', desc: '解析意见→策略→起草→压力测试' },
230
- { num: 'W5', label: 'Resubmit 换会重投', entry: 'resubmit-pipeline', desc: '硬约束重投,不加实验不改bib' },
231
- { num: 'W6', label: 'Conference Talk 会议演讲', entry: 'paper-talk', desc: '论文→Beamer+PPTX+讲稿' },
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代码是否诚实(假GT/自归一化/幻影结果)' },
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: '填充paper页面的TODO' },
243
- { label: 'meta-optimize 自我优化', skill: 'meta-optimize', desc: '分析使用日志改进ARIS自身' },
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
- function WbChipRow(props) {
247
- return h('div', { className: 'wb-chip-row' },
248
- props.items.map(function (it) {
249
- return h('button', {
250
- key: it.skill || it.entry,
251
- className: 'wb-pano-chip',
252
- onClick: function () { props.onPick(it.skill || it.entry) },
253
- title: it.desc || '',
254
- },
255
- it.num ? h('span', { className: 'wb-pano-num' }, it.num) : null,
256
- h('span', null, it.label))
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('span', { className: 'wb-pano-group-label' }, '工作流'),
264
- h(WbChipRow, { items: WORKFLOW_CHIPS, onPick: props.onPick })),
265
- h('div', { className: 'wb-pano-group' }, h('span', { className: 'wb-pano-group-label' }, '审计链'),
266
- h(WbChipRow, { items: AUDIT_CHIPS, onPick: props.onPick })),
267
- h('div', { className: 'wb-pano-group' }, h('span', { className: 'wb-pano-group-label' }, '记忆'),
268
- h(WbChipRow, { items: MEMORY_CHIPS, onPick: props.onPick })))
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-panorama { margin-bottom: 18px; border: 1px solid #e0e0e0; border-radius: 6px; padding: 12px 16px; background: #f7f7f7; }
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 prompt = '请使用 ARIS 技能 ' + TICK + skill + TICK + ' 完成对应工作流。' + argText
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.2",
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",