@memtensor/memos-local-openclaw-plugin 0.3.19 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/README.md +232 -22
  2. package/dist/capture/index.d.ts +1 -1
  3. package/dist/capture/index.d.ts.map +1 -1
  4. package/dist/capture/index.js +33 -8
  5. package/dist/capture/index.js.map +1 -1
  6. package/dist/index.d.ts +1 -1
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +2 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/ingest/providers/anthropic.d.ts.map +1 -1
  11. package/dist/ingest/providers/anthropic.js +22 -8
  12. package/dist/ingest/providers/anthropic.js.map +1 -1
  13. package/dist/ingest/providers/bedrock.d.ts.map +1 -1
  14. package/dist/ingest/providers/bedrock.js +22 -8
  15. package/dist/ingest/providers/bedrock.js.map +1 -1
  16. package/dist/ingest/providers/gemini.d.ts.map +1 -1
  17. package/dist/ingest/providers/gemini.js +22 -8
  18. package/dist/ingest/providers/gemini.js.map +1 -1
  19. package/dist/ingest/providers/index.d.ts +13 -18
  20. package/dist/ingest/providers/index.d.ts.map +1 -1
  21. package/dist/ingest/providers/index.js +213 -139
  22. package/dist/ingest/providers/index.js.map +1 -1
  23. package/dist/ingest/providers/openai.d.ts +1 -1
  24. package/dist/ingest/providers/openai.d.ts.map +1 -1
  25. package/dist/ingest/providers/openai.js +37 -17
  26. package/dist/ingest/providers/openai.js.map +1 -1
  27. package/dist/ingest/task-processor.d.ts +28 -3
  28. package/dist/ingest/task-processor.d.ts.map +1 -1
  29. package/dist/ingest/task-processor.js +166 -67
  30. package/dist/ingest/task-processor.js.map +1 -1
  31. package/dist/ingest/worker.d.ts.map +1 -1
  32. package/dist/ingest/worker.js +97 -75
  33. package/dist/ingest/worker.js.map +1 -1
  34. package/dist/shared/llm-call.d.ts +26 -0
  35. package/dist/shared/llm-call.d.ts.map +1 -0
  36. package/dist/shared/llm-call.js +163 -0
  37. package/dist/shared/llm-call.js.map +1 -0
  38. package/dist/skill/evaluator.d.ts +0 -3
  39. package/dist/skill/evaluator.d.ts.map +1 -1
  40. package/dist/skill/evaluator.js +34 -59
  41. package/dist/skill/evaluator.js.map +1 -1
  42. package/dist/skill/evolver.d.ts +22 -1
  43. package/dist/skill/evolver.d.ts.map +1 -1
  44. package/dist/skill/evolver.js +191 -32
  45. package/dist/skill/evolver.js.map +1 -1
  46. package/dist/skill/generator.d.ts +0 -3
  47. package/dist/skill/generator.d.ts.map +1 -1
  48. package/dist/skill/generator.js +15 -50
  49. package/dist/skill/generator.js.map +1 -1
  50. package/dist/skill/upgrader.d.ts +0 -2
  51. package/dist/skill/upgrader.d.ts.map +1 -1
  52. package/dist/skill/upgrader.js +4 -39
  53. package/dist/skill/upgrader.js.map +1 -1
  54. package/dist/skill/validator.d.ts +0 -2
  55. package/dist/skill/validator.d.ts.map +1 -1
  56. package/dist/skill/validator.js +14 -44
  57. package/dist/skill/validator.js.map +1 -1
  58. package/dist/storage/sqlite.d.ts +13 -2
  59. package/dist/storage/sqlite.d.ts.map +1 -1
  60. package/dist/storage/sqlite.js +72 -6
  61. package/dist/storage/sqlite.js.map +1 -1
  62. package/dist/tools/memory-get.d.ts.map +1 -1
  63. package/dist/tools/memory-get.js +5 -1
  64. package/dist/tools/memory-get.js.map +1 -1
  65. package/dist/tools/memory-search.d.ts.map +1 -1
  66. package/dist/tools/memory-search.js +5 -0
  67. package/dist/tools/memory-search.js.map +1 -1
  68. package/dist/tools/memory-timeline.d.ts.map +1 -1
  69. package/dist/tools/memory-timeline.js +11 -2
  70. package/dist/tools/memory-timeline.js.map +1 -1
  71. package/dist/types.d.ts +2 -1
  72. package/dist/types.d.ts.map +1 -1
  73. package/dist/types.js +1 -1
  74. package/dist/types.js.map +1 -1
  75. package/dist/viewer/html.d.ts +1 -1
  76. package/dist/viewer/html.d.ts.map +1 -1
  77. package/dist/viewer/html.js +233 -9
  78. package/dist/viewer/html.js.map +1 -1
  79. package/dist/viewer/server.d.ts +5 -0
  80. package/dist/viewer/server.d.ts.map +1 -1
  81. package/dist/viewer/server.js +383 -177
  82. package/dist/viewer/server.js.map +1 -1
  83. package/index.ts +26 -4
  84. package/package.json +2 -1
  85. package/src/capture/index.ts +39 -10
  86. package/src/index.ts +3 -2
  87. package/src/ingest/providers/anthropic.ts +22 -8
  88. package/src/ingest/providers/bedrock.ts +22 -8
  89. package/src/ingest/providers/gemini.ts +22 -8
  90. package/src/ingest/providers/index.ts +192 -142
  91. package/src/ingest/providers/openai.ts +37 -17
  92. package/src/ingest/task-processor.ts +183 -65
  93. package/src/ingest/worker.ts +98 -77
  94. package/src/shared/llm-call.ts +144 -0
  95. package/src/skill/evaluator.ts +35 -64
  96. package/src/skill/evolver.ts +201 -33
  97. package/src/skill/generator.ts +16 -59
  98. package/src/skill/upgrader.ts +5 -43
  99. package/src/skill/validator.ts +15 -47
  100. package/src/storage/sqlite.ts +88 -6
  101. package/src/tools/memory-get.ts +6 -1
  102. package/src/tools/memory-search.ts +6 -0
  103. package/src/tools/memory-timeline.ts +13 -1
  104. package/src/types.ts +2 -1
  105. package/src/viewer/html.ts +233 -9
  106. package/src/viewer/server.ts +368 -187
@@ -1 +1 @@
1
- {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,i0zOAwyHf,CAAC"}
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,mxvPAwgIf,CAAC"}
@@ -417,7 +417,7 @@ input,textarea,select{font-family:inherit;font-size:inherit}
417
417
 
418
418
  /* ─── Analytics / 统计 ─── */
419
419
  .nav-tabs{display:flex;align-items:center;gap:2px;background:rgba(255,255,255,.06);border-radius:10px;padding:3px}
420
- .nav-tabs .tab{padding:6px 20px;border-radius:8px;font-size:13px;font-weight:600;color:var(--text-sec);background:transparent;border:1px solid transparent;cursor:pointer;transition:all .2s;white-space:nowrap}
420
+ .nav-tabs .tab{padding:6px 20px;border-radius:8px;font-size:13px;font-weight:600;color:var(--text-sec);background:transparent;border:1px solid rgba(0,0,0,0);cursor:pointer;transition:color .2s,background .2s,box-shadow .2s;white-space:nowrap}
421
421
  .nav-tabs .tab:hover{color:var(--text)}
422
422
  .nav-tabs .tab.active{color:var(--text);background:rgba(255,255,255,.1);border-color:var(--border);box-shadow:0 1px 4px rgba(0,0,0,.15)}
423
423
  [data-theme="light"] .nav-tabs{background:rgba(0,0,0,.05)}
@@ -819,6 +819,7 @@ input,textarea,select{font-family:inherit;font-size:inherit}
819
819
  <div class="task-detail-summary" id="taskDetailSummary"></div>
820
820
  <div class="task-detail-chunks-title" data-i18n="tasks.chunks">Related Memories</div>
821
821
  <div class="task-detail-chunks" id="taskDetailChunks"></div>
822
+ <div id="taskDetailActions" style="display:flex;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid var(--border)"></div>
822
823
  </div>
823
824
  </div>
824
825
  </div>
@@ -867,6 +868,7 @@ input,textarea,select{font-family:inherit;font-size:inherit}
867
868
  <div class="task-detail-chunks" id="skillVersionsList" style="gap:10px"></div>
868
869
  <div class="task-detail-chunks-title" style="margin-top:16px" data-i18n="skills.related">Related Tasks</div>
869
870
  <div class="task-detail-chunks" id="skillRelatedTasks" style="gap:8px"></div>
871
+ <div id="skillDetailActions" style="display:flex;gap:8px;margin-top:16px;padding-top:12px;border-top:1px solid var(--border)"></div>
870
872
  </div>
871
873
  </div>
872
874
  <div class="analytics-view" id="analyticsView">
@@ -1122,8 +1124,20 @@ input,textarea,select{font-family:inherit;font-size:inherit}
1122
1124
  <div id="migrateActions" style="display:flex;gap:12px;align-items:center;flex-wrap:wrap">
1123
1125
  <button class="btn btn-ghost" onclick="migrateScan()" id="migrateScanBtn" data-i18n="migrate.scan">Scan Data Sources</button>
1124
1126
  <button class="btn btn-primary" onclick="migrateStart()" id="migrateStartBtn" style="display:none" data-i18n="migrate.start">Start Import</button>
1127
+ <span id="migrateConcurrencyRow" style="display:none;align-items:center;gap:6px">
1128
+ <span style="font-size:11px;color:var(--text-muted)" data-i18n="migrate.concurrency.label">Concurrent agents</span>
1129
+ <select id="migrateConcurrency" class="filter-select" style="min-width:auto;padding:3px 10px;font-size:11px">
1130
+ <option value="1" selected>1</option>
1131
+ <option value="2">2</option>
1132
+ <option value="4">4</option>
1133
+ <option value="8">8</option>
1134
+ </select>
1135
+ </span>
1125
1136
  <span id="migrateStatus" style="font-size:11px;color:var(--text-muted)"></span>
1126
1137
  </div>
1138
+ <div id="migrateConcurrencyWarn" style="display:none;margin-top:8px;padding:8px 12px;background:rgba(245,158,11,.06);border:1px solid rgba(245,158,11,.2);border-radius:8px;font-size:11px;color:#f59e0b;line-height:1.5">
1139
+ <span data-i18n="migrate.concurrency.warn">\u26A0 Increasing concurrency raises LLM API call frequency, which may trigger rate limits and cause failures.</span>
1140
+ </div>
1127
1141
 
1128
1142
  <!-- Post-process section: shown after import completes -->
1129
1143
  <div id="postprocessSection" style="display:none;margin-top:16px">
@@ -1146,11 +1160,23 @@ input,textarea,select{font-family:inherit;font-size:inherit}
1146
1160
  </div>
1147
1161
  </label>
1148
1162
  </div>
1149
- <div style="display:flex;gap:10px;align-items:center">
1163
+ <div style="display:flex;gap:10px;align-items:center;flex-wrap:wrap">
1150
1164
  <button class="btn btn-primary" id="ppStartBtn" onclick="ppStart()" data-i18n="pp.start">Start Processing</button>
1151
1165
  <button class="btn btn-sm" id="ppStopBtn" onclick="ppStop()" style="display:none;background:rgba(239,68,68,.12);color:#ef4444;border:1px solid rgba(239,68,68,.3);font-size:12px;padding:5px 16px;font-weight:600" data-i18n="migrate.stop">\u25A0 Stop</button>
1166
+ <span style="display:inline-flex;align-items:center;gap:6px">
1167
+ <span style="font-size:11px;color:var(--text-muted)" data-i18n="pp.concurrency.label">Concurrent agents</span>
1168
+ <select id="ppConcurrency" class="filter-select" style="min-width:auto;padding:3px 10px;font-size:11px">
1169
+ <option value="1" selected>1</option>
1170
+ <option value="2">2</option>
1171
+ <option value="4">4</option>
1172
+ <option value="8">8</option>
1173
+ </select>
1174
+ </span>
1152
1175
  <span id="ppStatus" style="font-size:11px;color:var(--text-muted)"></span>
1153
1176
  </div>
1177
+ <div id="ppConcurrencyWarn" style="display:none;margin-top:8px;padding:8px 12px;background:rgba(245,158,11,.06);border:1px solid rgba(245,158,11,.2);border-radius:8px;font-size:11px;color:#f59e0b;line-height:1.5">
1178
+ <span data-i18n="pp.concurrency.warn">\u26A0 Increasing concurrency raises LLM API call frequency, which may trigger rate limits and cause failures.</span>
1179
+ </div>
1154
1180
  <div id="ppProgress" style="display:none;margin-top:12px">
1155
1181
  <div style="display:flex;align-items:center;gap:12px;margin-bottom:8px">
1156
1182
  <div style="font-size:12px;font-weight:600;color:var(--text)" id="ppPhaseLabel"></div>
@@ -1455,6 +1481,8 @@ const I18N={
1455
1481
  'migrate.config.warn.desc':'Please configure both Embedding Model and Summarizer Model above before importing. These are required for processing memories.',
1456
1482
  'migrate.sqlite.label':'Memory Index (SQLite)',
1457
1483
  'migrate.sessions.label':'Conversation History',
1484
+ 'migrate.concurrency.label':'Concurrent agents',
1485
+ 'migrate.concurrency.warn':'\u26A0 Increasing concurrency raises LLM API call frequency, which may trigger rate limits and cause failures.',
1458
1486
  'migrate.scan':'Scan Data Sources',
1459
1487
  'migrate.start':'Start Import',
1460
1488
  'migrate.scanning':'Scanning...',
@@ -1478,6 +1506,8 @@ const I18N={
1478
1506
  'pp.tasks.hint':'Group imported messages into tasks and generate a structured summary (title, goal, steps, result) for each one. Makes it easier to search and recall past work.',
1479
1507
  'pp.skills.label':'Trigger skill evolution',
1480
1508
  'pp.skills.hint':'Analyze completed tasks and automatically create or upgrade reusable skills (SKILL.md). Requires task summaries to be enabled. May take longer due to LLM evaluation.',
1509
+ 'pp.concurrency.label':'Concurrent agents',
1510
+ 'pp.concurrency.warn':'\u26A0 Increasing concurrency raises LLM API call frequency, which may trigger rate limits and cause failures.',
1481
1511
  'pp.start':'Start Processing',
1482
1512
  'pp.resume':'Resume Processing',
1483
1513
  'pp.running':'Processing',
@@ -1526,7 +1556,25 @@ const I18N={
1526
1556
  'tasks.role.assistant':'Assistant',
1527
1557
  'tasks.error':'Error',
1528
1558
  'tasks.error.detail':'Failed to load task details',
1529
- 'tasks.untitled.related':'Untitled'
1559
+ 'tasks.untitled.related':'Untitled',
1560
+ 'task.edit':'Edit',
1561
+ 'task.delete':'Delete',
1562
+ 'task.save':'Save',
1563
+ 'task.cancel':'Cancel',
1564
+ 'task.delete.confirm':'Are you sure you want to delete this task? This cannot be undone.',
1565
+ 'task.delete.error':'Failed to delete task: ',
1566
+ 'task.save.error':'Failed to save task: ',
1567
+ 'task.retrySkill':'Retry Skill Generation',
1568
+ 'task.retrySkill.short':'Retry Skill',
1569
+ 'task.retrySkill.confirm':'Re-trigger skill generation for this task?',
1570
+ 'task.retrySkill.error':'Failed to retry skill generation: ',
1571
+ 'skill.edit':'Edit',
1572
+ 'skill.delete':'Delete',
1573
+ 'skill.save':'Save',
1574
+ 'skill.cancel':'Cancel',
1575
+ 'skill.delete.confirm':'Are you sure you want to delete this skill? This will also remove all associated files and cannot be undone.',
1576
+ 'skill.delete.error':'Failed to delete skill: ',
1577
+ 'skill.save.error':'Failed to save skill: '
1530
1578
  },
1531
1579
  zh:{
1532
1580
  'title':'OpenClaw 记忆',
@@ -1726,6 +1774,8 @@ const I18N={
1726
1774
  'migrate.config.warn.desc':'请先在上方配置好 Embedding 模型和 Summarizer 模型,这两项是处理记忆所必需的。',
1727
1775
  'migrate.sqlite.label':'记忆索引 (SQLite)',
1728
1776
  'migrate.sessions.label':'对话历史',
1777
+ 'migrate.concurrency.label':'并行 Agent 数',
1778
+ 'migrate.concurrency.warn':'\u26A0 提高并行数会增加 LLM API 调用频率,可能触发限流而导致失败。',
1729
1779
  'migrate.scan':'扫描数据源',
1730
1780
  'migrate.start':'开始导入',
1731
1781
  'migrate.scanning':'扫描中...',
@@ -1749,6 +1799,8 @@ const I18N={
1749
1799
  'pp.tasks.hint':'将导入的消息按任务分组,为每个任务生成结构化摘要(标题、目标、步骤、结果),方便日后搜索和回忆。',
1750
1800
  'pp.skills.label':'触发技能进化',
1751
1801
  'pp.skills.hint':'分析已完成的任务,自动创建或升级可复用的技能(SKILL.md)。需要先启用任务摘要。由于需要 LLM 评估,耗时较长。',
1802
+ 'pp.concurrency.label':'并行 Agent 数',
1803
+ 'pp.concurrency.warn':'\u26A0 提高并行数会增加 LLM API 调用频率,可能触发限流而导致失败。',
1752
1804
  'pp.start':'开始处理',
1753
1805
  'pp.resume':'继续处理',
1754
1806
  'pp.running':'正在处理',
@@ -1797,7 +1849,25 @@ const I18N={
1797
1849
  'tasks.role.assistant':'助手',
1798
1850
  'tasks.error':'出错了',
1799
1851
  'tasks.error.detail':'加载任务详情失败',
1800
- 'tasks.untitled.related':'未命名'
1852
+ 'tasks.untitled.related':'未命名',
1853
+ 'task.edit':'编辑',
1854
+ 'task.delete':'删除',
1855
+ 'task.save':'保存',
1856
+ 'task.cancel':'取消',
1857
+ 'task.delete.confirm':'确定要删除此任务吗?此操作不可撤销。',
1858
+ 'task.delete.error':'删除任务失败:',
1859
+ 'task.save.error':'保存任务失败:',
1860
+ 'task.retrySkill':'重新生成技能',
1861
+ 'task.retrySkill.short':'重试技能',
1862
+ 'task.retrySkill.confirm':'确定要为此任务重新触发技能生成吗?',
1863
+ 'task.retrySkill.error':'重新生成技能失败:',
1864
+ 'skill.edit':'编辑',
1865
+ 'skill.delete':'删除',
1866
+ 'skill.save':'保存',
1867
+ 'skill.cancel':'取消',
1868
+ 'skill.delete.confirm':'确定要删除此技能吗?关联的文件也会被删除,此操作不可撤销。',
1869
+ 'skill.delete.error':'删除技能失败:',
1870
+ 'skill.save.error':'保存技能失败:'
1801
1871
  }
1802
1872
  };
1803
1873
  const LANG_KEY='memos-viewer-lang';
@@ -2216,6 +2286,12 @@ async function loadTasks(){
2216
2286
  '<span class="tag"><span class="icon">\\u{1F4DD}</span> '+task.chunkCount+' '+t('tasks.chunks.label')+'</span>'+
2217
2287
  '<span class="tag"><span class="icon">\\u{1F4C2}</span> '+(task.sessionKey||'').slice(0,12)+'</span>'+
2218
2288
  '</div>'+
2289
+ '<div class="card-actions" onclick="event.stopPropagation()">'+
2290
+ '<button class="btn btn-sm btn-ghost" onclick="openTaskDetail(\\''+task.id+'\\')">'+t('card.expand')+'</button>'+
2291
+ '<button class="btn btn-sm btn-ghost" onclick="editTaskInline(\\''+task.id+'\\')">'+t('card.edit')+'</button>'+
2292
+ (task.status==='completed'&&(!task.skillStatus||task.skillStatus==='not_generated'||task.skillStatus==='skipped')?'<button class="btn btn-sm btn-ghost" onclick="retrySkillGen(\\''+task.id+'\\')">'+t('task.retrySkill.short')+'</button>':'')+
2293
+ '<button class="btn btn-sm btn-ghost" style="color:var(--accent)" onclick="deleteTask(\\''+task.id+'\\')">'+t('task.delete')+'</button>'+
2294
+ '</div>'+
2219
2295
  '</div>';
2220
2296
  }).join('');
2221
2297
 
@@ -2240,7 +2316,10 @@ function renderTasksPagination(total){
2240
2316
  el.innerHTML=html;
2241
2317
  }
2242
2318
 
2319
+ var _currentTaskId=null;
2320
+ var _currentTaskData=null;
2243
2321
  async function openTaskDetail(taskId){
2322
+ _currentTaskId=taskId;
2244
2323
  const overlay=document.getElementById('taskDetailOverlay');
2245
2324
  overlay.classList.add('show');
2246
2325
  document.getElementById('taskDetailTitle').textContent=t('tasks.loading');
@@ -2249,6 +2328,7 @@ async function openTaskDetail(taskId){
2249
2328
  document.getElementById('taskSkillSection').className='task-skill-section';
2250
2329
  document.getElementById('taskDetailSummary').textContent='';
2251
2330
  document.getElementById('taskDetailChunks').innerHTML='<div class="spinner"></div>';
2331
+ document.getElementById('taskDetailActions').innerHTML='';
2252
2332
 
2253
2333
  try{
2254
2334
  const r=await fetch('/api/task/'+taskId);
@@ -2266,9 +2346,13 @@ async function openTaskDetail(taskId){
2266
2346
  meta.push('<div style="width:100%;margin-top:4px"><span class="meta-item" style="width:100%">'+t('tasks.taskid')+'<span class="task-id-full">'+esc(task.id)+'</span></span></div>');
2267
2347
  document.getElementById('taskDetailMeta').innerHTML=meta.join('');
2268
2348
 
2349
+ _currentTaskData=task;
2350
+
2269
2351
  // ── Skill status section ──
2270
2352
  renderTaskSkillSection(task);
2271
2353
 
2354
+ document.getElementById('taskDetailActions').innerHTML='';
2355
+
2272
2356
  var summaryEl=document.getElementById('taskDetailSummary');
2273
2357
  if(task.status==='skipped'){
2274
2358
  summaryEl.innerHTML='<div style="color:var(--text-muted);font-style:italic;display:flex;align-items:flex-start;gap:8px"><span style="font-size:18px">\\u26A0\\uFE0F</span><span>'+esc(task.summary||t('tasks.skipped.default'))+'</span></div>';
@@ -2322,19 +2406,31 @@ function renderTaskSkillSection(task){
2322
2406
  }else if(ss==='not_generated'){
2323
2407
  section.className='task-skill-section status-not_generated';
2324
2408
  section.innerHTML='<div class="skill-status-header">\\u274C \u672A\u751F\u6210\u6280\u80FD</div>'+
2325
- '<div class="skill-status-reason">\u539F\u56E0\uFF1A'+esc(task.skillReason||'\u7ECF LLM \u8BC4\u4F30\uFF0C\u8BE5\u4EFB\u52A1\u4E0D\u9002\u5408\u63D0\u70BC\u4E3A\u53EF\u590D\u7528\u6280\u80FD\u3002')+'</div>';
2409
+ '<div class="skill-status-reason">\u539F\u56E0\uFF1A'+esc(task.skillReason||'\u7ECF LLM \u8BC4\u4F30\uFF0C\u8BE5\u4EFB\u52A1\u4E0D\u9002\u5408\u63D0\u70BC\u4E3A\u53EF\u590D\u7528\u6280\u80FD\u3002')+'</div>'+
2410
+ (task.status==='completed'?'<button class="btn btn-primary" onclick="retrySkillGen(\\''+esc(task.id)+'\\')" style="margin-top:8px;font-size:12px">'+t('task.retrySkill')+'</button>':'');
2326
2411
  }else if(ss==='skipped'){
2327
2412
  section.className='task-skill-section status-skipped';
2328
2413
  section.innerHTML='<div class="skill-status-header">\\u23ED \u8DF3\u8FC7\u6280\u80FD\u8BC4\u4F30</div>'+
2329
- '<div class="skill-status-reason">\u539F\u56E0\uFF1A'+esc(task.skillReason||'')+'</div>';
2414
+ '<div class="skill-status-reason">\u539F\u56E0\uFF1A'+esc(task.skillReason||'')+'</div>'+
2415
+ (task.status==='completed'?'<button class="btn btn-primary" onclick="retrySkillGen(\\''+esc(task.id)+'\\')" style="margin-top:8px;font-size:12px">'+t('task.retrySkill')+'</button>':'');
2416
+ }else if(ss==='queued'){
2417
+ section.className='task-skill-section status-generating';
2418
+ section.innerHTML='<div class="skill-status-header">\\u{1F4CB} \u6392\u961F\u4E2D</div>'+
2419
+ '<div class="skill-status-reason">'+esc(task.skillReason||'\u7B49\u5F85\u6280\u80FD\u8BC4\u4F30\uFF0C\u524D\u65B9\u4EFB\u52A1\u5904\u7406\u5B8C\u6210\u540E\u81EA\u52A8\u5F00\u59CB\u3002')+'</div>';
2330
2420
  }else if(task.status==='active'){
2331
2421
  section.className='task-skill-section status-skipped';
2332
2422
  section.innerHTML='<div class="skill-status-header">\\u23F8 \u4EFB\u52A1\u8FDB\u884C\u4E2D</div>'+
2333
2423
  '<div class="skill-status-reason">\u6280\u80FD\u8BC4\u4F30\u5728\u4EFB\u52A1\u5B8C\u6210\u540E\u81EA\u52A8\u8FD0\u884C\u3002</div>';
2424
+ }else if(task.status==='completed'){
2425
+ section.className='task-skill-section status-generating';
2426
+ section.innerHTML='<div class="skill-status-header">\\u23F3 \u7B49\u5F85\u8BC4\u4F30</div>'+
2427
+ '<div class="skill-status-reason">\u4EFB\u52A1\u5DF2\u5B8C\u6210\uFF0C\u6280\u80FD\u8BC4\u4F30\u5373\u5C06\u5F00\u59CB\u3002</div>'+
2428
+ '<button class="btn btn-primary" onclick="retrySkillGen(\\''+esc(task.id)+'\\')" style="margin-top:8px;font-size:12px">'+t('task.retrySkill')+'</button>';
2334
2429
  }else{
2335
2430
  section.className='task-skill-section status-skipped';
2336
2431
  section.innerHTML='<div class="skill-status-header">\\u2014 \u65E0\u6280\u80FD\u4FE1\u606F</div>'+
2337
- '<div class="skill-status-reason">\u8BE5\u4EFB\u52A1\u5728\u6280\u80FD\u8FDB\u5316\u7CFB\u7EDF\u542F\u7528\u4E4B\u524D\u5B8C\u6210\uFF0C\u65E0\u6280\u80FD\u8BC4\u4F30\u8BB0\u5F55\u3002</div>';
2432
+ '<div class="skill-status-reason">\u8BE5\u4EFB\u52A1\u672A\u8FDB\u884C\u6280\u80FD\u8BC4\u4F30\u3002</div>'+
2433
+ (task.status==='completed'?'<button class="btn btn-primary" onclick="retrySkillGen(\\''+esc(task.id)+'\\')" style="margin-top:8px;font-size:12px">'+t('task.retrySkill')+'</button>':'');
2338
2434
  }
2339
2435
  }
2340
2436
 
@@ -2343,6 +2439,55 @@ function closeTaskDetail(event){
2343
2439
  document.getElementById('taskDetailOverlay').classList.remove('show');
2344
2440
  }
2345
2441
 
2442
+ async function retrySkillGen(taskId){
2443
+ if(!confirm(t('task.retrySkill.confirm'))) return;
2444
+ try{
2445
+ const r=await fetch('/api/task/'+taskId+'/retry-skill',{method:'POST'});
2446
+ const d=await r.json();
2447
+ if(!r.ok) throw new Error(d.error||'unknown');
2448
+ openTaskDetail(taskId);
2449
+ }catch(e){ alert(t('task.retrySkill.error')+e.message); }
2450
+ }
2451
+
2452
+ async function deleteTask(taskId){
2453
+ if(!confirm(t('task.delete.confirm'))) return;
2454
+ try{
2455
+ const r=await fetch('/api/task/'+taskId,{method:'DELETE'});
2456
+ const d=await r.json();
2457
+ if(!r.ok) throw new Error(d.error||'unknown');
2458
+ closeTaskDetail();
2459
+ document.getElementById('taskDetailOverlay').classList.remove('show');
2460
+ loadTasks();
2461
+ }catch(e){ alert(t('task.delete.error')+e.message); }
2462
+ }
2463
+
2464
+ async function editTaskInline(){
2465
+ if(!_currentTaskData) return;
2466
+ var task=_currentTaskData;
2467
+ var titleEl=document.getElementById('taskDetailTitle');
2468
+ var summaryEl=document.getElementById('taskDetailSummary');
2469
+ var actionsEl=document.getElementById('taskDetailActions');
2470
+
2471
+ titleEl.innerHTML='<input id="editTaskTitle" class="filter-input" style="width:100%;font-size:16px;font-weight:600" value="'+esc(task.title||'')+'"/>';
2472
+ summaryEl.innerHTML='<textarea id="editTaskSummary" class="filter-input" style="width:100%;min-height:80px;font-size:13px;resize:vertical">'+esc(task.summary||'')+'</textarea>';
2473
+ actionsEl.innerHTML=
2474
+ '<button class="btn btn-primary" onclick="saveTaskEdit()" style="font-size:12px">'+t('task.save')+'</button>'+
2475
+ '<button class="btn btn-ghost" onclick="openTaskDetail(\\''+esc(task.id)+'\\')" style="font-size:12px">'+t('task.cancel')+'</button>';
2476
+ }
2477
+
2478
+ async function saveTaskEdit(){
2479
+ if(!_currentTaskId) return;
2480
+ var title=document.getElementById('editTaskTitle').value.trim();
2481
+ var summary=document.getElementById('editTaskSummary').value.trim();
2482
+ try{
2483
+ const r=await fetch('/api/task/'+_currentTaskId,{method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({title:title,summary:summary})});
2484
+ const d=await r.json();
2485
+ if(!r.ok) throw new Error(d.error||'unknown');
2486
+ openTaskDetail(_currentTaskId);
2487
+ loadTasks();
2488
+ }catch(e){ alert(t('task.save.error')+e.message); }
2489
+ }
2490
+
2346
2491
  /* ─── Skills View Logic ─── */
2347
2492
  let skillsStatusFilter='';
2348
2493
 
@@ -2400,6 +2545,12 @@ async function loadSkills(){
2400
2545
  '<span class="tag"><span class="icon">\\u{1F4E6}</span> '+skill.sourceType+'</span>'+
2401
2546
  (tags.length>0?'<div class="skill-card-tags">'+tags.map(t=>'<span class="skill-tag">'+esc(t)+'</span>').join('')+'</div>':'')+
2402
2547
  '</div>'+
2548
+ '<div class="card-actions" onclick="event.stopPropagation()">'+
2549
+ '<button class="btn btn-sm btn-ghost" onclick="openSkillDetail(\\''+skill.id+'\\')">'+t('card.expand')+'</button>'+
2550
+ '<button class="btn btn-sm btn-ghost" onclick="editSkillInline(\\''+skill.id+'\\')">'+t('card.edit')+'</button>'+
2551
+ (skill.visibility==='public'?'<button class="btn btn-sm btn-ghost" onclick="toggleSkillPublic(\\''+skill.id+'\\',false)">\\u{1F512} '+t('skills.setPrivate')+'</button>':'<button class="btn btn-sm btn-ghost" onclick="toggleSkillPublic(\\''+skill.id+'\\',true)">\\u{1F310} '+t('skills.setPublic')+'</button>')+
2552
+ '<button class="btn btn-sm btn-ghost" style="color:var(--accent)" onclick="deleteSkill(\\''+skill.id+'\\')">'+t('skill.delete')+'</button>'+
2553
+ '</div>'+
2403
2554
  '</div>';
2404
2555
  }).join('');
2405
2556
  }catch(e){
@@ -2424,6 +2575,7 @@ async function openSkillDetail(skillId){
2424
2575
  document.getElementById('skillDetailContent').innerHTML='<div class="spinner"></div>';
2425
2576
  document.getElementById('skillVersionsList').innerHTML='<div class="spinner"></div>';
2426
2577
  document.getElementById('skillRelatedTasks').innerHTML='';
2578
+ document.getElementById('skillDetailActions').innerHTML='';
2427
2579
 
2428
2580
  try{
2429
2581
  const r=await fetch('/api/skill/'+skillId);
@@ -2519,6 +2671,9 @@ async function openSkillDetail(skillId){
2519
2671
  ).join('');
2520
2672
  }
2521
2673
 
2674
+ window._currentSkillData=skill;
2675
+ document.getElementById('skillDetailActions').innerHTML='';
2676
+
2522
2677
  }catch(e){
2523
2678
  document.getElementById('skillDetailTitle').textContent=t('skills.error');
2524
2679
  document.getElementById('skillDetailContent').innerHTML='<div style="color:var(--rose);padding:16px">'+t('skills.error.detail')+esc(String(e))+'</div>';
@@ -2547,6 +2702,18 @@ async function toggleSkillVisibility(){
2547
2702
  }
2548
2703
  }
2549
2704
 
2705
+ async function toggleSkillPublic(id,setPublic){
2706
+ const newVis=setPublic?'public':'private';
2707
+ try{
2708
+ const r=await fetch('/api/skill/'+id+'/visibility',{method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({visibility:newVis})});
2709
+ if(!r.ok) throw new Error('Failed: '+r.status);
2710
+ toast(setPublic?t('toast.setPublic'):t('toast.setPrivate'),'success');
2711
+ loadSkills();
2712
+ }catch(e){
2713
+ toast('Error: '+e.message,'error');
2714
+ }
2715
+ }
2716
+
2550
2717
  /* ─── Settings / Config ─── */
2551
2718
  async function loadConfig(){
2552
2719
  try{
@@ -2668,6 +2835,41 @@ function closeSkillDetail(event){
2668
2835
  document.getElementById('skillDetailOverlay').classList.remove('show');
2669
2836
  }
2670
2837
 
2838
+ async function deleteSkill(skillId){
2839
+ if(!confirm(t('skill.delete.confirm'))) return;
2840
+ try{
2841
+ const r=await fetch('/api/skill/'+skillId,{method:'DELETE'});
2842
+ const d=await r.json();
2843
+ if(!r.ok) throw new Error(d.error||'unknown');
2844
+ closeSkillDetail();
2845
+ document.getElementById('skillDetailOverlay').classList.remove('show');
2846
+ loadSkills();
2847
+ }catch(e){ alert(t('skill.delete.error')+e.message); }
2848
+ }
2849
+
2850
+ function editSkillInline(){
2851
+ var skill=window._currentSkillData;
2852
+ if(!skill) return;
2853
+ var descEl=document.getElementById('skillDetailDesc');
2854
+ var actionsEl=document.getElementById('skillDetailActions');
2855
+ descEl.innerHTML='<textarea id="editSkillDesc" class="filter-input" style="width:100%;min-height:60px;font-size:13px;resize:vertical">'+esc(skill.description||'')+'</textarea>';
2856
+ actionsEl.innerHTML=
2857
+ '<button class="btn btn-primary" onclick="saveSkillEdit()" style="font-size:12px">'+t('skill.save')+'</button>'+
2858
+ '<button class="btn btn-ghost" onclick="openSkillDetail(\\''+esc(skill.id)+'\\')" style="font-size:12px">'+t('skill.cancel')+'</button>';
2859
+ }
2860
+
2861
+ async function saveSkillEdit(){
2862
+ if(!currentSkillId) return;
2863
+ var desc=document.getElementById('editSkillDesc').value.trim();
2864
+ try{
2865
+ const r=await fetch('/api/skill/'+currentSkillId,{method:'PUT',headers:{'Content-Type':'application/json'},body:JSON.stringify({description:desc})});
2866
+ const d=await r.json();
2867
+ if(!r.ok) throw new Error(d.error||'unknown');
2868
+ openSkillDetail(currentSkillId);
2869
+ loadSkills();
2870
+ }catch(e){ alert(t('skill.save.error')+e.message); }
2871
+ }
2872
+
2671
2873
  function formatDuration(ms){
2672
2874
  const s=Math.floor(ms/1000);
2673
2875
  if(s<60) return s+'s';
@@ -3371,6 +3573,19 @@ async function clearAll(){
3371
3573
  let migrateScanData=null;
3372
3574
  let migrateStats={stored:0,skipped:0,merged:0,errors:0};
3373
3575
 
3576
+ (function(){
3577
+ const sel=document.getElementById('migrateConcurrency');
3578
+ if(sel) sel.addEventListener('change',function(){
3579
+ const w=document.getElementById('migrateConcurrencyWarn');
3580
+ if(w) w.style.display=parseInt(this.value,10)>1?'block':'none';
3581
+ });
3582
+ const ppSel=document.getElementById('ppConcurrency');
3583
+ if(ppSel) ppSel.addEventListener('change',function(){
3584
+ const w=document.getElementById('ppConcurrencyWarn');
3585
+ if(w) w.style.display=parseInt(this.value,10)>1?'block':'none';
3586
+ });
3587
+ })();
3588
+
3374
3589
  async function migrateScan(){
3375
3590
  const btn=document.getElementById('migrateScanBtn');
3376
3591
  btn.disabled=true;
@@ -3406,6 +3621,7 @@ async function migrateScan(){
3406
3621
 
3407
3622
  if(d.totalItems>0 && d.configReady){
3408
3623
  document.getElementById('migrateStartBtn').style.display='inline-flex';
3624
+ document.getElementById('migrateConcurrencyRow').style.display='inline-flex';
3409
3625
  }
3410
3626
 
3411
3627
  if(d.totalItems===0){
@@ -3427,10 +3643,15 @@ function migrateStart(){
3427
3643
  if(!migrateScanData||!migrateScanData.configReady)return;
3428
3644
  if(!confirm(t('migrate.start')+'?'))return;
3429
3645
 
3646
+ const concSel=document.getElementById('migrateConcurrency');
3647
+ const concurrency=concSel?parseInt(concSel.value,10)||1:1;
3648
+
3430
3649
  window._migrateRunning=true;
3431
3650
  _migrateStatusChecked=false;
3432
3651
  document.getElementById('migrateStartBtn').style.display='none';
3433
3652
  document.getElementById('migrateScanBtn').disabled=true;
3653
+ document.getElementById('migrateConcurrencyRow').style.display='none';
3654
+ document.getElementById('migrateConcurrencyWarn').style.display='none';
3434
3655
  document.getElementById('migrateProgress').style.display='block';
3435
3656
  document.getElementById('migrateLiveLog').innerHTML='';
3436
3657
  migrateStats={stored:0,skipped:0,merged:0,errors:0};
@@ -3440,7 +3661,7 @@ function migrateStart(){
3440
3661
  document.getElementById('migrateBar').style.width='0%';
3441
3662
  document.getElementById('migrateBar').style.background='linear-gradient(90deg,#6366f1,#8b5cf6)';
3442
3663
  document.getElementById('migrateCounter').textContent='';
3443
- const body=JSON.stringify({sources:['sqlite','sessions']});
3664
+ const body=JSON.stringify({sources:['sqlite','sessions'],concurrency});
3444
3665
  connectMigrateSSE('/api/migrate/start','POST',body);
3445
3666
  }
3446
3667
 
@@ -3645,6 +3866,9 @@ function ppStart(){
3645
3866
  var enableSkills=document.getElementById('ppEnableSkills').checked;
3646
3867
  if(!enableTasks&&!enableSkills){toast(t('pp.select.warn'),'error');return;}
3647
3868
 
3869
+ var ppConcSel=document.getElementById('ppConcurrency');
3870
+ var ppConcurrency=ppConcSel?parseInt(ppConcSel.value,10)||1:1;
3871
+
3648
3872
  window._ppRunning=true;
3649
3873
  _ppSSEConnected=false;
3650
3874
  ppStats={tasks:0,skills:0,errors:0,skipped:0};
@@ -3661,7 +3885,7 @@ function ppStart(){
3661
3885
  document.getElementById('ppLiveLog').innerHTML='';
3662
3886
  updatePPStats();
3663
3887
 
3664
- var body=JSON.stringify({enableTasks:enableTasks,enableSkills:enableSkills});
3888
+ var body=JSON.stringify({enableTasks:enableTasks,enableSkills:enableSkills,concurrency:ppConcurrency});
3665
3889
  fetch('/api/migrate/postprocess',{method:'POST',headers:{'Content-Type':'application/json'},body:body})
3666
3890
  .then(function(r){
3667
3891
  if(!r.ok){
@@ -1 +1 @@
1
- {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAwyHlB,CAAC"}
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/viewer/html.ts"],"names":[],"mappings":";;;AAAa,QAAA,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAwgIlB,CAAC"}
@@ -58,6 +58,11 @@ export declare class ViewerServer {
58
58
  private walkDir;
59
59
  private serveSkillDownload;
60
60
  private handleSkillVisibility;
61
+ private handleTaskRetrySkill;
62
+ private handleTaskDelete;
63
+ private handleTaskUpdate;
64
+ private handleSkillDelete;
65
+ private handleSkillUpdate;
61
66
  private handleCreate;
62
67
  private serveMemoryDetail;
63
68
  private handleUpdate;
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/viewer/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/viewer/server.ts"],"names":[],"mappings":"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"}