@geminixiang/mikan 1.0.0-beta.92 → 1.0.0-beta.94

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 (110) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/adapters/discord/bot.d.ts +2 -2
  3. package/dist/adapters/discord/bot.d.ts.map +1 -1
  4. package/dist/adapters/discord/bot.js +9 -3
  5. package/dist/adapters/discord/bot.js.map +1 -1
  6. package/dist/adapters/github/bot.d.ts +2 -2
  7. package/dist/adapters/github/bot.d.ts.map +1 -1
  8. package/dist/adapters/github/bot.js +4 -3
  9. package/dist/adapters/github/bot.js.map +1 -1
  10. package/dist/adapters/intake.d.ts.map +1 -1
  11. package/dist/adapters/intake.js.map +1 -1
  12. package/dist/adapters/shared.d.ts +0 -2
  13. package/dist/adapters/shared.d.ts.map +1 -1
  14. package/dist/adapters/shared.js +1 -17
  15. package/dist/adapters/shared.js.map +1 -1
  16. package/dist/adapters/slack/bot.d.ts +2 -2
  17. package/dist/adapters/slack/bot.d.ts.map +1 -1
  18. package/dist/adapters/slack/bot.js +13 -22
  19. package/dist/adapters/slack/bot.js.map +1 -1
  20. package/dist/adapters/slack/jev-context.d.ts.map +1 -1
  21. package/dist/adapters/slack/jev-context.js +3 -17
  22. package/dist/adapters/slack/jev-context.js.map +1 -1
  23. package/dist/adapters/slack/task-status.d.ts.map +1 -1
  24. package/dist/adapters/slack/task-status.js +4 -9
  25. package/dist/adapters/slack/task-status.js.map +1 -1
  26. package/dist/adapters/telegram/bot.d.ts +2 -2
  27. package/dist/adapters/telegram/bot.d.ts.map +1 -1
  28. package/dist/adapters/telegram/bot.js +9 -3
  29. package/dist/adapters/telegram/bot.js.map +1 -1
  30. package/dist/adapters/types.d.ts +4 -4
  31. package/dist/adapters/types.d.ts.map +1 -1
  32. package/dist/adapters/types.js.map +1 -1
  33. package/dist/adapters/web/admin/client-assets.d.ts +1 -1
  34. package/dist/adapters/web/admin/client-assets.d.ts.map +1 -1
  35. package/dist/adapters/web/admin/client-assets.js +106 -18
  36. package/dist/adapters/web/admin/client-assets.js.map +1 -1
  37. package/dist/adapters/web/admin/portal.d.ts +0 -7
  38. package/dist/adapters/web/admin/portal.d.ts.map +1 -1
  39. package/dist/adapters/web/admin/portal.js +98 -66
  40. package/dist/adapters/web/admin/portal.js.map +1 -1
  41. package/dist/harness/execution-resolver.d.ts.map +1 -1
  42. package/dist/harness/execution-resolver.js +1 -2
  43. package/dist/harness/execution-resolver.js.map +1 -1
  44. package/dist/harness/presenter.d.ts.map +1 -1
  45. package/dist/harness/presenter.js +5 -26
  46. package/dist/harness/presenter.js.map +1 -1
  47. package/dist/harness/prompt.d.ts +1 -3
  48. package/dist/harness/prompt.d.ts.map +1 -1
  49. package/dist/harness/prompt.js +4 -38
  50. package/dist/harness/prompt.js.map +1 -1
  51. package/dist/harness/runner.d.ts.map +1 -1
  52. package/dist/harness/runner.js +14 -41
  53. package/dist/harness/runner.js.map +1 -1
  54. package/dist/harness/session.d.ts.map +1 -1
  55. package/dist/harness/session.js +2 -9
  56. package/dist/harness/session.js.map +1 -1
  57. package/dist/harness/skills.d.ts +11 -2
  58. package/dist/harness/skills.d.ts.map +1 -1
  59. package/dist/harness/skills.js +84 -25
  60. package/dist/harness/skills.js.map +1 -1
  61. package/dist/harness/tools/attach.d.ts +3 -0
  62. package/dist/harness/tools/attach.d.ts.map +1 -1
  63. package/dist/harness/tools/attach.js +36 -1
  64. package/dist/harness/tools/attach.js.map +1 -1
  65. package/dist/harness/tools/index.d.ts +3 -19
  66. package/dist/harness/tools/index.d.ts.map +1 -1
  67. package/dist/harness/tools/index.js +22 -11
  68. package/dist/harness/tools/index.js.map +1 -1
  69. package/dist/harness/tools/types.d.ts +9 -1
  70. package/dist/harness/tools/types.d.ts.map +1 -1
  71. package/dist/harness/tools/types.js.map +1 -1
  72. package/dist/harness/types.d.ts +7 -14
  73. package/dist/harness/types.d.ts.map +1 -1
  74. package/dist/harness/types.js.map +1 -1
  75. package/dist/office/log.d.ts +14 -0
  76. package/dist/office/log.d.ts.map +1 -0
  77. package/dist/office/log.js +46 -0
  78. package/dist/office/log.js.map +1 -0
  79. package/dist/office/projection.d.ts.map +1 -1
  80. package/dist/office/projection.js +17 -12
  81. package/dist/office/projection.js.map +1 -1
  82. package/dist/office/types.d.ts +1 -0
  83. package/dist/office/types.d.ts.map +1 -1
  84. package/dist/office/types.js.map +1 -1
  85. package/dist/sandbox/index.d.ts +1 -1
  86. package/dist/sandbox/index.d.ts.map +1 -1
  87. package/dist/sandbox/index.js +1 -1
  88. package/dist/sandbox/index.js.map +1 -1
  89. package/dist/sandbox/registry.d.ts +1 -1
  90. package/dist/sandbox/registry.d.ts.map +1 -1
  91. package/dist/sandbox/registry.js +1 -1
  92. package/dist/sandbox/registry.js.map +1 -1
  93. package/dist/sessions/chat-history-sync.d.ts.map +1 -1
  94. package/dist/sessions/chat-history-sync.js +48 -46
  95. package/dist/sessions/chat-history-sync.js.map +1 -1
  96. package/dist/sessions/session-store.d.ts +2 -17
  97. package/dist/sessions/session-store.d.ts.map +1 -1
  98. package/dist/sessions/session-store.js +44 -34
  99. package/dist/sessions/session-store.js.map +1 -1
  100. package/dist/sessions/types.d.ts +20 -1
  101. package/dist/sessions/types.d.ts.map +1 -1
  102. package/dist/sessions/types.js.map +1 -1
  103. package/dist/settings/index.d.ts +3 -1
  104. package/dist/settings/index.d.ts.map +1 -1
  105. package/dist/settings/index.js +14 -0
  106. package/dist/settings/index.js.map +1 -1
  107. package/dist/types.d.ts +13 -0
  108. package/dist/types.d.ts.map +1 -1
  109. package/dist/types.js.map +1 -1
  110. package/package.json +5 -5
@@ -749,45 +749,112 @@ export const adminViewFunctionsScript = ` let activeConversationKey = default
749
749
  });
750
750
 
751
751
  let skillsCache = [];
752
+ let skillsPrompt = null;
752
753
 
753
- function renderSkillsInto(containerId, skills, allowedSource) {
754
+ function skillGroup(directory) {
755
+ const slash = directory.lastIndexOf('/');
756
+ return slash < 0 ? '' : directory.slice(0, slash);
757
+ }
758
+
759
+ function skillCheckbox(s, scope) {
760
+ if (scope === 'global') return s.globalEnabled ? '[x]' : '[ ]';
761
+ if (s.conversationRule === '+') return '[+]';
762
+ if (s.conversationRule === '-') return '[-]';
763
+ return s.enabled ? '[x]' : '[ ]';
764
+ }
765
+
766
+ function skillSuffix(s, scope) {
767
+ if (scope === 'global') return s.globalRule === '!' ? 'excluded by pattern' : '';
768
+ if (s.conversationRule === '+') return 'conversation load';
769
+ if (s.conversationRule === '-') return 'conversation unload';
770
+ if (s.conversationRule === '!') return 'excluded by pattern';
771
+ return s.source === 'global' ? 'inherited global' : '';
772
+ }
773
+
774
+ function nextSkillState(s, scope) {
775
+ if (scope === 'global') return s.globalEnabled ? 'unload' : 'load';
776
+ if (s.conversationRule === '+') return 'unload';
777
+ if (s.conversationRule === '-') return 'inherit';
778
+ return 'load';
779
+ }
780
+
781
+ function renderSkillsInto(containerId, skills, scope) {
754
782
  const container = document.getElementById(containerId);
755
783
  if (!container) return;
756
- const filtered = allowedSource ? skills.filter((s) => s.source === allowedSource) : skills;
784
+ const filterEl = document.getElementById(scope === 'global' ? 'global-skills-filter' : 'skills-filter');
785
+ const query = filterEl ? filterEl.value.trim().toLowerCase() : '';
786
+ const scoped = scope === 'global' ? skills.filter((s) => s.source === 'global') : skills;
787
+ const filtered = query
788
+ ? scoped.filter((s) => (s.name + ' ' + s.directory + ' ' + s.description).toLowerCase().includes(query))
789
+ : scoped;
790
+ const summaryEl = document.getElementById(scope === 'global' ? 'global-skills-summary' : 'skills-summary');
791
+ if (summaryEl) {
792
+ summaryEl.textContent = scope === 'global'
793
+ ? 'Enabled globally: ' + scoped.filter((s) => s.globalEnabled).length + ' / ' + scoped.length
794
+ : skillsPrompt ? 'In prompt: ' + skillsPrompt.listed + ' / ' + skillsPrompt.total + ' skills · ' + skillsPrompt.chars.toLocaleString() + ' chars' : '';
795
+ }
757
796
  if (filtered.length === 0) {
758
797
  container.innerHTML = '<div class="empty-state">No skills available</div>';
759
798
  return;
760
799
  }
800
+ const groups = new Map();
801
+ for (const s of filtered) {
802
+ const key = (s.source === 'conversation' ? 'conversation:' : '') + skillGroup(s.directory);
803
+ groups.set(key, [...(groups.get(key) || []), s]);
804
+ }
761
805
  container.innerHTML = '<div class="skills-list">' +
762
- filtered.map((s) =>
763
- '<div class="skill-row">' +
764
- '<button class="skill-row-btn" data-skill-source="' + escAttr(s.source) + '" data-skill-directory="' + escAttr(s.directory) + '" data-skill-name="' + escAttr(s.name) + '">' +
765
- '<div class="skill-name">' + escHtml(s.name) + '<span class="skill-source skill-source-' + s.source + '">' + s.source + '</span></div>' +
766
- (s.description ? '<div class="skill-desc">' + escHtml(s.description) + '</div>' : '') +
767
- '</button>' +
768
- '<div class="skill-row-actions">' +
769
- '<button class="mcp-btn" data-skill-edit-source="' + escAttr(s.source) + '" data-skill-edit-directory="' + escAttr(s.directory) + '">Edit</button>' +
770
- '<button class="mcp-btn mcp-btn-danger" data-skill-delete-source="' + escAttr(s.source) + '" data-skill-delete-directory="' + escAttr(s.directory) + '" data-skill-delete-name="' + escAttr(s.name) + '">Delete</button>' +
771
- '</div>' +
772
- '</div>'
806
+ [...groups.entries()].sort((a, b) => a[0].localeCompare(b[0])).map(([key, items]) =>
807
+ '<div class="skill-group">' + escHtml(key.startsWith('conversation:') ? 'This conversation' + (key.length > 13 ? ' · ' + key.slice(13) : '') : key || 'skills/') + '</div>' +
808
+ items.map((s) => {
809
+ const suffix = skillSuffix(s, scope);
810
+ const dimmed = scope === 'conversation' && s.source === 'global' && !s.conversationRule;
811
+ return '<div class="skill-row' + (dimmed ? ' skill-row-dim' : '') + '">' +
812
+ '<button class="skill-toggle" title="' + (scope === 'global' ? 'Toggle for every conversation' : 'Cycle inherit / + / -') + '" data-skill-toggle-scope="' + scope + '" data-skill-toggle-source="' + escAttr(s.source) + '" data-skill-toggle-directory="' + escAttr(s.directory) + '" data-skill-toggle-state="' + nextSkillState(s, scope) + '">' + skillCheckbox(s, scope) + '</button>' +
813
+ '<button class="skill-row-btn" data-skill-source="' + escAttr(s.source) + '" data-skill-directory="' + escAttr(s.directory) + '" data-skill-name="' + escAttr(s.name) + '">' +
814
+ '<div class="skill-name">' + escHtml(s.name) + '<span class="skill-source skill-source-' + s.source + '">' + s.source + '</span>' + (suffix ? '<span class="skill-state">' + escHtml(suffix) + '</span>' : '') + '</div>' +
815
+ (s.description ? '<div class="skill-desc">' + escHtml(s.description) + '</div>' : '') +
816
+ '</button>' +
817
+ (s.editable ?
818
+ '<div class="skill-row-actions">' +
819
+ '<button class="mcp-btn" data-skill-edit-source="' + escAttr(s.source) + '" data-skill-edit-directory="' + escAttr(s.directory) + '">Edit</button>' +
820
+ '<button class="mcp-btn mcp-btn-danger" data-skill-delete-source="' + escAttr(s.source) + '" data-skill-delete-directory="' + escAttr(s.directory) + '" data-skill-delete-name="' + escAttr(s.name) + '">Delete</button>' +
821
+ '</div>' : '') +
822
+ '</div>';
823
+ }).join('')
773
824
  ).join('') + '</div>';
774
825
  }
775
826
 
827
+ function renderAllSkills() {
828
+ renderSkillsInto('skills-content', skillsCache, 'conversation');
829
+ renderSkillsInto('global-skills-content', skillsCache, 'global');
830
+ }
831
+
832
+ function applySkillsData(data) {
833
+ skillsCache = Array.isArray(data.skills) ? data.skills : [];
834
+ skillsPrompt = data.prompt || null;
835
+ renderAllSkills();
836
+ }
837
+
776
838
  async function loadSkills() {
777
839
  const container = document.getElementById('skills-content');
778
840
  const previewEl = document.getElementById('skills-preview');
779
841
  container.innerHTML = '<div class="loading-msg">Loading…</div>';
780
842
  if (previewEl) previewEl.innerHTML = '<div class="placeholder-msg">Click a skill to preview SKILL.md</div>';
781
843
  try {
782
- const data = await apiGet('/admin/api/skills?' + scopeQuery());
783
- skillsCache = Array.isArray(data.skills) ? data.skills : [];
784
- renderSkillsInto('skills-content', skillsCache);
785
- renderSkillsInto('global-skills-content', skillsCache, 'global');
844
+ applySkillsData(await apiGet('/admin/api/skills?' + scopeQuery()));
786
845
  } catch (err) {
787
846
  container.innerHTML = '<div class="err-msg">' + escHtml(err.message) + '</div>';
788
847
  }
789
848
  }
790
849
 
850
+ async function toggleSkill(scope, source, directory, state) {
851
+ try {
852
+ applySkillsData(await apiPost('/admin/api/skills/toggle', { scope: scope, source: source, directory: directory, state: state, ...scopeBody() }));
853
+ } catch (err) {
854
+ alert(err.message);
855
+ }
856
+ }
857
+
791
858
  const loadGlobalSkills = loadSkills;
792
859
 
793
860
  async function previewSkillInto(previewId, source, directory, name) {
@@ -820,6 +887,11 @@ export const adminViewFunctionsScript = ` let activeConversationKey = default
820
887
  const el = document.getElementById(containerId);
821
888
  if (!el) return;
822
889
  el.addEventListener('click', (event) => {
890
+ const toggleBtn = event.target.closest('[data-skill-toggle-scope]');
891
+ if (toggleBtn) {
892
+ void toggleSkill(toggleBtn.dataset.skillToggleScope, toggleBtn.dataset.skillToggleSource, toggleBtn.dataset.skillToggleDirectory, toggleBtn.dataset.skillToggleState);
893
+ return;
894
+ }
823
895
  const previewBtn = event.target.closest('[data-skill-source]');
824
896
  if (previewBtn) {
825
897
  previewSkillInto(previewId, previewBtn.dataset.skillSource, previewBtn.dataset.skillDirectory, previewBtn.dataset.skillName);
@@ -1422,8 +1494,24 @@ export const adminViewStyles = `
1422
1494
  .skill-row {
1423
1495
  padding: 10px 12px; border: 1px solid var(--border); border-radius: 10px;
1424
1496
  background: rgba(0,0,0,0.02);
1425
- display: flex; flex-direction: column; align-items: stretch; gap: 6px;
1497
+ display: flex; flex-direction: row; align-items: flex-start; gap: 10px;
1498
+ }
1499
+ .skill-row-dim { opacity: 0.6; }
1500
+ .skill-toggle {
1501
+ flex-shrink: 0; cursor: pointer; border: none; background: transparent; padding: 0;
1502
+ font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: 0.85rem; color: var(--text);
1503
+ }
1504
+ .skill-group {
1505
+ margin-top: 8px; font-family: 'JetBrains Mono', ui-monospace, monospace;
1506
+ font-size: 0.75rem; color: var(--subtle);
1507
+ }
1508
+ .skill-state { font-size: 0.72rem; font-weight: 500; color: var(--subtle); }
1509
+ .skills-toolbar { display: flex; align-items: center; gap: 12px; margin-bottom: 10px; }
1510
+ .skills-filter {
1511
+ flex: 0 1 260px; padding: 6px 10px; border: 1px solid var(--border); border-radius: 8px;
1512
+ background: var(--card); font-size: 0.82rem; color: var(--text);
1426
1513
  }
1514
+ .skills-summary { font-size: 0.8rem; color: var(--muted); }
1427
1515
  .skill-row-btn {
1428
1516
  flex: 1 1 auto; min-width: 0; text-align: left; cursor: pointer; font-family: inherit;
1429
1517
  background: transparent; border: none; padding: 0;