weir-harness 1.2.0 → 1.2.2

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 (99) hide show
  1. package/cordis.patch.yml +0 -2
  2. package/lib/client.blackboard-model.js +172 -56
  3. package/lib/client.capability-manager.js +0 -1
  4. package/lib/client.capability-model.js +378 -31
  5. package/lib/client.chain-model.js +80 -0
  6. package/lib/client.disabled-categories-editor.js +22 -0
  7. package/lib/client.edit-lock-maintenance.js +239 -246
  8. package/lib/client.edit-lock-panel.js +110 -0
  9. package/lib/client.hash-edit-model.js +48 -0
  10. package/lib/client.js +267 -1549
  11. package/lib/client.lsp-model.js +92 -0
  12. package/lib/client.lsp-panel.js +11 -16
  13. package/lib/client.lsp-toggle.js +18 -0
  14. package/lib/client.notify-permissions.js +112 -20
  15. package/lib/client.notify-web.js +14 -11
  16. package/lib/client.robash-model.js +26 -0
  17. package/lib/client.settings-page.js +287 -17
  18. package/lib/client.worktree-model.js +225 -0
  19. package/package.json +5 -2
  20. package/src/blackboard/durable.js +12 -0
  21. package/src/blackboard/index.js +2 -2
  22. package/src/blackboard/kernel.js +23 -6
  23. package/src/blackboard/notify.js +10 -3
  24. package/src/blackboard/remote.js +31 -13
  25. package/src/blackboard/storage.js +13 -5
  26. package/src/capabilities/apply-engine.js +189 -101
  27. package/src/capabilities/defaults-transaction.js +136 -1
  28. package/src/capabilities/lifecycle-snapshot.js +83 -204
  29. package/src/capabilities/mcp-admission.js +1 -23
  30. package/src/capabilities/mcp-drain.js +30 -19
  31. package/src/capabilities/mcp-facade.js +23 -3
  32. package/src/capabilities/preset-library.js +247 -0
  33. package/src/capabilities/preset-package.js +212 -1
  34. package/src/capabilities/same-name-policy.js +3 -41
  35. package/src/capabilities/selection-notify.js +324 -21
  36. package/src/capabilities/skill-office-adapter.js +7 -1
  37. package/src/capabilities/skill-selection-plugin.js +315 -729
  38. package/src/capabilities/store/checked-contract.d.ts +5 -0
  39. package/src/capabilities/store/fs-adapter.js +52 -0
  40. package/src/capabilities/store/lock.js +86 -0
  41. package/src/capabilities/store/paths.js +5 -0
  42. package/src/capabilities/store/store.js +105 -5
  43. package/src/creative-guide/guide.js +1 -1
  44. package/src/delegate/child-composition.js +258 -0
  45. package/src/delegate/group-coordinator.js +25 -27
  46. package/src/delegate/index.js +21 -2
  47. package/src/delegate/rehydrate.js +24 -4
  48. package/src/delegate/robash-guard-core.js +2 -2
  49. package/src/delegate/spawn-adapter.js +214 -100
  50. package/src/delegate/status-tool.js +9 -6
  51. package/src/delegate/supervision-mount.js +35 -6
  52. package/src/delegate/tool.js +29 -4
  53. package/src/{shared → delegate}/whitelist-defaults.js +2 -2
  54. package/src/edit-lock/admin-ledger.js +8 -11
  55. package/src/edit-lock/admin-recovery.js +2 -1
  56. package/src/edit-lock/admission.js +12 -2
  57. package/src/edit-lock/binding-guidance.js +28 -10
  58. package/src/edit-lock/binding-machine.js +312 -0
  59. package/src/edit-lock/derived-facts.js +67 -0
  60. package/src/edit-lock/index.js +44 -244
  61. package/src/edit-lock/inspect.js +113 -1
  62. package/src/edit-lock/lifecycle.js +8 -5
  63. package/src/edit-lock/limits.js +61 -0
  64. package/src/edit-lock/maintenance.js +5 -2
  65. package/src/edit-lock/manager.js +6 -2
  66. package/src/edit-lock/operation-history.js +1 -1
  67. package/src/edit-lock/peer-client.js +9 -2
  68. package/src/edit-lock/peer-transport.js +7 -1
  69. package/src/edit-lock/remote.js +11 -4
  70. package/src/edit-lock/state.js +2 -4
  71. package/src/edit-lock/view.js +10 -11
  72. package/src/lsp/admin.js +2 -24
  73. package/src/lsp/index.js +1 -1
  74. package/src/lsp/manager.js +1 -1
  75. package/src/notify/permissions-admin.js +1 -1
  76. package/src/{lsp/child-process.js → process/index.js} +23 -6
  77. package/src/settings/env-admin.js +1 -1
  78. package/src/settings/index.js +1 -1
  79. package/src/settings/sections.js +0 -54
  80. package/src/shared/audit.js +12 -0
  81. package/src/shared/child-scope.js +3 -1
  82. package/src/shared/http-json.js +28 -0
  83. package/src/{delegate/audit-readers.js → shared/terminal-evidence.js} +34 -4
  84. package/src/worktree/errors.js +3 -0
  85. package/src/worktree/index.js +1 -2
  86. package/src/worktree/lane-core.js +641 -0
  87. package/src/worktree/lane-views.js +147 -0
  88. package/src/worktree/lane-workflows.js +853 -0
  89. package/src/worktree/lanes.js +24 -1513
  90. package/src/worktree/runner.js +5 -4
  91. package/src/capabilities/content-pin.js +0 -88
  92. package/src/capabilities/content-refresh.js +0 -331
  93. package/src/capabilities/distribution-manifest.js +0 -78
  94. package/src/capabilities/isolated-exec.js +0 -106
  95. package/src/capabilities/publisher.js +0 -129
  96. package/src/capabilities/skill-admission.js +0 -181
  97. package/src/capabilities/update-lifecycle.js +0 -106
  98. package/src/edit-lock/remote-service.js +0 -28
  99. package/src/worktree/contract-guidance.test.js +0 -100
@@ -83,35 +83,6 @@ window.__ModuleLoader__.load({
83
83
  return "unsupported";
84
84
  }
85
85
 
86
- /**
87
- * The commit flow state machine (12.3): submission reuses the same
88
- * request ID for retries; a failure keeps the draft; a revision
89
- * conflict shows the current state for the user to re-pick (never a
90
- * silent rebase); a no-diff draft with missing warnings offers
91
- * install/configure instead of a fictional Apply; an indeterminate
92
- * result stays queryable.
93
- */
94
- function commitStateOf(draft) {
95
- if (!draft) return { phase: "idle" };
96
- if (draft.phase === "submitting") return { phase: "submitting", requestId: draft.requestId };
97
- if (draft.phase === "failed") return { phase: "failed", requestId: draft.requestId, error: draft.error ?? "unknown", draftKept: true };
98
- if (draft.phase === "revision-conflict") return { phase: "revision-conflict", current: draft.current ?? null, draftKept: true };
99
- if (draft.phase === "indeterminate") return { phase: "indeterminate", requestId: draft.requestId, queryable: true };
100
- if (draft.phase === "applied") return { phase: "applied", revision: draft.revision ?? null };
101
- if (draft.dirty === true) {
102
- if (Array.isArray(draft.missing) && draft.missing.length > 0 && draft.hasDiff !== true) {
103
- return { phase: "install-or-configure", missing: [...draft.missing] };
104
- }
105
- return { phase: "ready" };
106
- }
107
- return { phase: "idle" };
108
- }
109
-
110
- /** Discard vs keep-editing on a dirty draft close (12.3). */
111
- function closeDirtyDraft(decision) {
112
- return decision === "discard" ? { phase: "idle", draft: null } : { phase: "ready", keepEditing: true };
113
- }
114
-
115
86
  /**
116
87
  * Second-window convergence (12.5): an agent-preset/selected frame
117
88
  * refreshes THIS session's Badge only when the frame names the same
@@ -581,14 +552,390 @@ window.__ModuleLoader__.load({
581
552
  return `${base}.json`;
582
553
  }
583
554
 
555
+ // Locale data face (pure data, NO ctx calls — a chunk factory re-executes
556
+ // under HMR, so a chunk-local register would throw on the duplicate
557
+ // (namespace, locale) pair): the entry registers these under "settings.weir.capability"
558
+ // inside a ctx.effect when this chunk arrives (lib/client.js
559
+ // registerChunkDictionaries). Pinned by test/client.test.js's dictionary
560
+ // union pin.
561
+ const dictionaries = {
562
+ en: {
563
+ "capability.badge": "{skills} skills · {mcp} MCP",
564
+ "capability.unavailable.short": "Capabilities n/a",
565
+ "capability.effectiveUnknown": "Applied count unknown — refresh and check Skill sources",
566
+ "capability.effectiveUnknownShort": "Skills ? · MCP ?",
567
+ "capability.effectiveUnknownDetail": "Accepted revision; effective capabilities cannot be verified. Refresh and check Skill sources. Draft kept; only Apply changes the session.",
568
+ "capability.unknownOverwriteRisk": "Previous selection is unknown. Applying this draft may replace other accepted Skills and MCP servers. Review the full selection before confirming.",
569
+ "capability.confirmUnknownOverwrite": "Confirm replacing unknown selection",
570
+ "capability.error": "Capabilities unavailable for this session.",
571
+ "capability.unavailable": "Capabilities are unavailable in this session.",
572
+ "capability.unsupported": "Unsupported: consistency conditions are not met on this host.",
573
+ "capability.tab.skills": "Skills",
574
+ "capability.tab.mcp": "MCP",
575
+ "capability.tab.presets": "Presets",
576
+ "capability.search": "Search",
577
+ "capability.close": "Close",
578
+ "capability.conflict": "conflict",
579
+ "capability.sourceUnknown": "unknown source",
580
+ "capability.sourceNumber": " · source ",
581
+ "capability.sameNameWarning": "{name}: only one source can be enabled in this session. Uncheck one: {sources}.",
582
+ "capability.unresolvedNameWarning": "{name}: legacy name has no chosen source. Choose an exact source or remove the name: {sources}.",
583
+ "capability.unknownLegacyName": "{name}: no matching Skill in the current listing. Refresh the listing or remove this legacy name.",
584
+ "capability.inventoryUnavailableName": "The listing is unavailable; legacy names remain unresolved in the draft. Retry later; no source was selected.",
585
+ "capability.unresolvedNameTitle": "Choose a source for legacy name {name}",
586
+ "capability.replaceName": "Replace {name} with {source}",
587
+ "capability.removeName": "Remove legacy name {name}",
588
+ "capability.serverSameName": "Server rejected same-name Skill {names}. Uncheck one source, or refresh the listing; draft kept.",
589
+ "capability.serverMissing": "Server could not resolve {names}. Refresh the listing and choose an exact source or remove the name; draft kept.",
590
+ "capability.unknownName": "unknown name",
591
+ "capability.missing": "missing",
592
+ "capability.noSkills": "No skills match.",
593
+ "capability.mcp.groupManaged": "Weir managed",
594
+ "capability.mcp.groupUnmanaged": "Unmanaged",
595
+ "capability.mcp.none": "No MCP servers configured.",
596
+ "capability.mcp.unmanagedHint": "Configured outside Weir; the selection cannot govern it.",
597
+ "capability.mcp.stateMounted": "mounted",
598
+ "capability.mcp.stateRegistered": "registered",
599
+ "capability.unmanaged": "unmanaged",
600
+ "capability.mcp.add": "+ Add managed MCP server",
601
+ "capability.mcp.identity": "identity (e.g. my-docs)",
602
+ "capability.mcp.label": "label (display name, optional)",
603
+ "capability.mcp.command": "command (e.g. npx)",
604
+ "capability.mcp.args": "args, space-separated (optional)",
605
+ "capability.mcp.adding": "Adding…",
606
+ "capability.mcp.addConfirm": "Add",
607
+ "capability.mcp.cancel": "Cancel",
608
+ "capability.mcp.errorRequired": "Required.",
609
+ "capability.mcp.errorIdentityInvalid": "Letters, digits, \"-\" and \"_\" only; start with a letter or digit.",
610
+ "capability.diff.addSkills": "+{n} skills",
611
+ "capability.diff.removeSkills": "−{n} skills",
612
+ "capability.diff.addMcp": "+{n} MCP",
613
+ "capability.diff.removeMcp": "−{n} MCP",
614
+ "capability.apply": "Apply",
615
+ "capability.applying": "Applying…",
616
+ "capability.discard": "Discard",
617
+ "capability.applied": "Applied",
618
+ "capability.acceptedUnknown": "Accepted · effective count unknown",
619
+ "capability.appliedSkipped": "skipped {n} (not applicable here)",
620
+ "capability.failed": "Failed — draft kept",
621
+ "capability.conflictState": "Changed elsewhere — review current state",
622
+ "capability.missingAction": "Missing items need install/configure",
623
+ "capability.pending": "Result pending — query the receipt",
624
+ "capability.presets.unavailable": "Presets are unavailable on this host.",
625
+ "capability.presets.errorName": "Enter a name.",
626
+ "capability.presets.saved": "Preset saved.",
627
+ "capability.presets.replaced": "Replaced the confirmed preset under ID {id}; no second preset was created.",
628
+ "capability.presets.renameRow": "Rename preset…",
629
+ "capability.presets.resaveRow": "Re-save…",
630
+ "capability.presets.newName": "New preset name",
631
+ "capability.presets.renameSubmit": "Save new name",
632
+ "capability.presets.resaveSubmit": "Confirm re-save",
633
+ "capability.presets.editTarget": "Target: {name} · {scope} · ID {id} · revision {revision}",
634
+ "capability.presets.resaveConfirm": "Overwrite this preset from {source}: {skills} Skills · {mcp} MCP · {unresolved} unresolved. Current session stays unchanged.",
635
+ "capability.presets.renamed": "Preset renamed; current draft and applied selection unchanged.",
636
+ "capability.presets.resaved": "Preset re-saved; current draft and applied selection unchanged.",
637
+ "capability.presets.renameCollision": "That name belongs to another preset. Choose another name.",
638
+ "capability.presets.editConflict": "The preset changed. Review the refreshed row and confirm again.",
639
+ "capability.presets.sourceChanged": "The applied selection changed. Refresh the session receipt and confirm again.",
640
+ "capability.presets.sourceUnavailable": "Applied source unavailable{missing}. Restore the missing Skills, refresh the receipt, and confirm again.",
641
+ "capability.presets.appliedUnavailable": "The applied source has unavailable entries. Restore them and refresh the session receipt before re-saving.",
642
+ "capability.presets.appliedReceiptMissing": "The applied source cannot be verified from this receipt. Refresh the session receipt before re-saving; the current draft is still available.",
643
+ "capability.presets.locked": "Preset storage is busy. Wait, then refresh and decide again.",
644
+ "capability.presets.unreadable": "Preset storage cannot be read safely. Check the storage before retrying.",
645
+ "capability.presets.unsupported": "This preset version is unsupported. Update the client or host before editing.",
646
+ "capability.presets.gone": "This preset was deleted or is missing. Refresh the list; it was not recreated.",
647
+ "capability.presets.confirmAgain": "The replacement target changed. Refresh and confirm its identity again.",
648
+ "capability.presets.uncertain": "Result unknown. Refresh and inspect the preset before deciding whether to retry.",
649
+ "capability.presets.missingSelection": "The draft selection is incomplete. Refresh before saving.",
650
+ "capability.presets.replaceTarget": "Replace preset ID {id} at revision {revision} in {scope}?",
651
+ "capability.presets.noneKnown": "none reported",
652
+ "capability.presets.importPartial": "Installed Skills: {names}. Preset status is unconfirmed. Inspect the installed files and refresh the preset before deciding how to recover.",
653
+ "capability.presets.currentRevision": " Current stored revision: {revision}.",
654
+ "capability.presets.revisionConflict": "Changed elsewhere — the list was refreshed.",
655
+ "capability.presets.noWorkspace": "This session has no workspace.",
656
+ "capability.presets.saveFailed": "The preset could not be saved.",
657
+ "capability.presets.loaded": "Staged into the draft — Apply to activate.",
658
+ "capability.presets.loadedUnresolved": "Staged into the draft — {n} unresolved ref(s) reported.",
659
+ "capability.presets.loadFailed": "Load failed — the preset may be gone.",
660
+ "capability.presets.deleted": "Preset deleted.",
661
+ "capability.presets.deleteFailed": "Delete failed.",
662
+ "capability.presets.exportFailed": "Export failed.",
663
+ "capability.presets.imported": "Imported: {bound} MCP binding(s), {unresolved} unresolved ref(s).",
664
+ "capability.presets.counts": "{skills} skills · {mcp} MCP",
665
+ "capability.presets.countsUnresolved": " · {n} unresolved",
666
+ "capability.presets.loading": "Loading…",
667
+ "capability.presets.load": "Load",
668
+ "capability.presets.export": "Export",
669
+ "capability.presets.delete": "Delete",
670
+ "capability.presets.deleteConfirm": "Delete preset \"{name}\"? This cannot be undone.",
671
+ "capability.presets.deleteConfirmButton": "Delete preset",
672
+ "capability.presets.deleting": "Deleting…",
673
+ "capability.presets.cancel": "Cancel",
674
+ "capability.presets.exportLabel": "Preset JSON",
675
+ "capability.presets.copy": "Copy to clipboard",
676
+ "capability.presets.copied": "Copied",
677
+ "capability.presets.close": "Close",
678
+ "capability.presets.saveOpen": "Save as preset…",
679
+ "capability.presets.importOpen": "Import…",
680
+ "capability.presets.name": "Preset name",
681
+ "capability.presets.namespace": "Namespace",
682
+ "capability.presets.scopeWorkspace": "workspace",
683
+ "capability.presets.scopeGlobal": "global",
684
+ "capability.presets.source": "From",
685
+ "capability.presets.fromDraft": "current draft",
686
+ "capability.presets.fromApplied": "applied selection",
687
+ "capability.presets.nameConflict": "A preset named \"{name}\" already exists in this namespace.",
688
+ "capability.presets.rename": "Rename…",
689
+ "capability.presets.renameHint": "Edit the name, then save again.",
690
+ "capability.presets.replace": "Replace it",
691
+ "capability.presets.saving": "Saving…",
692
+ "capability.presets.save": "Save preset",
693
+ "capability.presets.importPlaceholder": "Paste a portable preset document (JSON)…",
694
+ "capability.presets.importing": "Importing…",
695
+ "capability.presets.importSubmit": "Import",
696
+ "capability.presets.importInvalidJson": "Not valid JSON — nothing was written.",
697
+ "capability.presets.importRejected": "Rejected: {reason} — nothing was written.",
698
+ "capability.presets.importNameConflict": "A preset with this name already exists here.",
699
+ "capability.presets.importFailed": "Import failed — nothing was written.",
700
+ "capability.presets.groupWorkspace": "Workspace presets",
701
+ "capability.presets.groupWorkspaceNone": "Workspace presets (no workspace)",
702
+ "capability.presets.groupGlobal": "Global presets",
703
+ "capability.presets.emptyWorkspace": "No workspace presets yet.",
704
+ "capability.presets.emptyGlobal": "No global presets yet.",
705
+ "capability.presets.defaultTitle": "Workspace default for new sessions",
706
+ "capability.presets.defaultUnavailable": "The workspace default is unavailable.",
707
+ "capability.presets.defaultNone": "No default is set — new sessions use the builtin baseline.",
708
+ "capability.presets.defaultEmpty": "An explicit empty default is set: new sessions start with 0 skills · 0 MCP.",
709
+ "capability.presets.defaultEntries": "Default: {counts}",
710
+ "capability.presets.defaultUnresolved": "…with {n} unresolved ref(s) reported on resolve.",
711
+ "capability.presets.defaultSaveOpen": "Save as default…",
712
+ "capability.presets.defaultClearOpen": "Clear default…",
713
+ "capability.presets.defaultSaveConfirm": "Save {counts} as this workspace's default? New sessions in this workspace will start from it; the current session does not change.",
714
+ "capability.presets.defaultSaveConfirmButton": "Save default",
715
+ "capability.presets.defaultSaved": "Workspace default saved.",
716
+ "capability.presets.defaultSaveFailed": "The default could not be saved.",
717
+ "capability.presets.defaultClearConfirm": "Clear the workspace default? New sessions return to the builtin baseline; open sessions do not change.",
718
+ "capability.presets.defaultClearConfirmButton": "Clear default",
719
+ "capability.presets.defaultCleared": "Workspace default cleared — new sessions use the builtin baseline.",
720
+ "capability.presets.defaultClearFailed": "The default could not be cleared.",
721
+ "capability.presets.clearing": "Clearing…",
722
+ "capability.presets.needsReceipt": "Unavailable until the session receipt loads.",
723
+ "capability.presets.exportDownload": "Download .json",
724
+ "capability.presets.downloaded": "Downloaded",
725
+ "capability.presets.importedPackage": "Imported: {installed} Skill(s) installed, {bound} MCP binding(s), {unresolved} unresolved ref(s).",
726
+ "capability.presets.importSummaryTitle": "Import summary — review before anything is written",
727
+ "capability.presets.importFiles": "{n} file(s)",
728
+ "capability.presets.importNoInstalls": "This package bundles no Skills to install.",
729
+ "capability.presets.importUnresolvedTitle": "Unresolved refs — not installed:",
730
+ "capability.presets.importCollision": "name collision",
731
+ "capability.presets.importCollisionDecision": "When a bundled Skill name already exists:",
732
+ "capability.presets.collisionCancel": "skip it (default)",
733
+ "capability.presets.collisionReplace": "replace it",
734
+ "capability.presets.collisionCoexist": "keep both, renamed",
735
+ "capability.presets.importConfirm": "Confirm import",
736
+ "capability.presets.importResultTitle": "Import result",
737
+ "capability.presets.importInstalledNote": "Installed Skills stay unselected — pick them in the draft and Apply to activate.",
738
+ "capability.presets.importInstallFailed": "Installation failed: {reason} — rolled back {n} file(s); no preset was created.",
739
+ "capability.presets.importNoTargetRoot": "No {scope} Skill root is available on this host — nothing was installed.",
740
+ "capability.presets.scopeProject": "project",
741
+ "capability.presets.scopeUser": "user",
742
+ "capability.loading": "Loading capabilities…",
743
+ unavailable: "This plugin is not loaded, so it cannot be configured right now.",
744
+ save: "Save",
745
+ },
746
+ zh: {
747
+ "capability.badge": "{skills} 个技能 · {mcp} 个 MCP",
748
+ "capability.unavailable.short": "能力不可用",
749
+ "capability.effectiveUnknown": "已应用数量未知——请刷新并检查技能来源",
750
+ "capability.effectiveUnknownShort": "技能 ? · MCP ?",
751
+ "capability.effectiveUnknownDetail": "修订已接受,但有效能力暂无法核实。请刷新并检查技能来源。草稿已保留;只有手动应用才会更改会话。",
752
+ "capability.unknownOverwriteRisk": "原有选择未知。应用此草稿可能覆盖其他已接受的技能与 MCP server。确认前请核对完整选择。",
753
+ "capability.confirmUnknownOverwrite": "确认替换未知选择",
754
+ "capability.error": "此会话的能力不可用。",
755
+ "capability.unavailable": "能力在此会话中不可用。",
756
+ "capability.unsupported": "不支持:此宿主未满足一致性条件。",
757
+ "capability.tab.skills": "技能",
758
+ "capability.tab.mcp": "MCP",
759
+ "capability.tab.presets": "预设",
760
+ "capability.search": "搜索",
761
+ "capability.close": "关闭",
762
+ "capability.conflict": "冲突",
763
+ "capability.sourceUnknown": "未知来源",
764
+ "capability.sourceNumber": " · 候选 ",
765
+ "capability.sameNameWarning": "{name}:本会话只能启用一个来源。请取消其中一项:{sources}。",
766
+ "capability.unresolvedNameWarning": "{name}:旧名称尚未选定来源。请选择精确来源或移除该名称:{sources}。",
767
+ "capability.unknownLegacyName": "{name}:当前清单中没有匹配的技能。请刷新清单或移除这个旧名称。",
768
+ "capability.inventoryUnavailableName": "清单暂不可读;旧名称在草稿中保持未解析。请稍后重试;未选择任何来源。",
769
+ "capability.unresolvedNameTitle": "为旧名称 {name} 选择来源",
770
+ "capability.replaceName": "将 {name} 替换为 {source}",
771
+ "capability.removeName": "移除旧名称 {name}",
772
+ "capability.serverSameName": "服务端拒绝同名技能 {names}。请取消一个来源或刷新清单;草稿已保留。",
773
+ "capability.serverMissing": "服务端无法解析 {names}。请刷新清单并选择精确来源或移除该名称;草稿已保留。",
774
+ "capability.unknownName": "未知名称",
775
+ "capability.missing": "缺失",
776
+ "capability.noSkills": "没有匹配的技能。",
777
+ "capability.mcp.groupManaged": "Weir 管理",
778
+ "capability.mcp.groupUnmanaged": "未纳入管理",
779
+ "capability.mcp.none": "未配置 MCP server。",
780
+ "capability.mcp.unmanagedHint": "在 Weir 之外配置,会话选择无法管理它。",
781
+ "capability.mcp.stateMounted": "已挂载",
782
+ "capability.mcp.stateRegistered": "已注册",
783
+ "capability.unmanaged": "未管理",
784
+ "capability.mcp.add": "+ 添加受管 MCP server",
785
+ "capability.mcp.identity": "identity(如 my-docs)",
786
+ "capability.mcp.label": "标签(显示名,可选)",
787
+ "capability.mcp.command": "命令(如 npx)",
788
+ "capability.mcp.args": "参数,空格分隔(可选)",
789
+ "capability.mcp.adding": "正在添加…",
790
+ "capability.mcp.addConfirm": "添加",
791
+ "capability.mcp.cancel": "取消",
792
+ "capability.mcp.errorRequired": "必填。",
793
+ "capability.mcp.errorIdentityInvalid": "仅限字母、数字、\"-\"、\"_\",且以字母或数字开头。",
794
+ "capability.diff.addSkills": "+{n} 个技能",
795
+ "capability.diff.removeSkills": "−{n} 个技能",
796
+ "capability.diff.addMcp": "+{n} 个 MCP",
797
+ "capability.diff.removeMcp": "−{n} 个 MCP",
798
+ "capability.apply": "应用",
799
+ "capability.applying": "正在应用…",
800
+ "capability.discard": "放弃",
801
+ "capability.applied": "已应用",
802
+ "capability.acceptedUnknown": "已接受 · 有效数量未知",
803
+ "capability.appliedSkipped": "已跳过 {n} 项(当前预设不适用)",
804
+ "capability.failed": "失败——草稿已保留",
805
+ "capability.conflictState": "已在别处变更——请核对当前状态",
806
+ "capability.missingAction": "缺失项需要安装/配置",
807
+ "capability.pending": "结果待确认——请查询回执",
808
+ "capability.presets.unavailable": "预设在此宿主上不可用。",
809
+ "capability.presets.errorName": "请输入名称。",
810
+ "capability.presets.saved": "预设已保存。",
811
+ "capability.presets.replaced": "已替换确认的预设 ID {id};未新建第二个预设。",
812
+ "capability.presets.renameRow": "重命名预设…",
813
+ "capability.presets.resaveRow": "重新保存…",
814
+ "capability.presets.newName": "新预设名称",
815
+ "capability.presets.renameSubmit": "保存新名称",
816
+ "capability.presets.resaveSubmit": "确认重新保存",
817
+ "capability.presets.editTarget": "目标:{name} · {scope} · ID {id} · 修订 {revision}",
818
+ "capability.presets.resaveConfirm": "从{source}覆盖此预设:{skills} 个技能 · {mcp} 个 MCP · {unresolved} 个未解析引用。当前会话不变。",
819
+ "capability.presets.renamed": "预设已改名;当前草稿和已应用选择不变。",
820
+ "capability.presets.resaved": "预设已重新保存;当前草稿和已应用选择不变。",
821
+ "capability.presets.renameCollision": "此名称已属于另一预设,请另选名称。",
822
+ "capability.presets.editConflict": "预设已更改;请检查刷新后的行并重新确认。",
823
+ "capability.presets.sourceChanged": "已应用选择已改变;请刷新会话回执后重新确认。",
824
+ "capability.presets.sourceUnavailable": "已应用来源不可用{missing}。请恢复缺失技能、刷新回执后重新确认。",
825
+ "capability.presets.appliedUnavailable": "已应用来源有不可用项目。请恢复项目并刷新会话回执后重新保存。",
826
+ "capability.presets.appliedReceiptMissing": "当前回执无法验证已应用来源。请刷新会话回执后重新保存;当前草稿仍可使用。",
827
+ "capability.presets.locked": "预设存储正忙;请稍后刷新并重新决定。",
828
+ "capability.presets.unreadable": "无法安全读取预设存储;重试前请检查存储。",
829
+ "capability.presets.unsupported": "不支持此预设版本;编辑前请更新客户端或宿主。",
830
+ "capability.presets.gone": "预设已删除或不存在;请刷新列表,它未被重建。",
831
+ "capability.presets.confirmAgain": "替换目标已改变;请刷新并重新确认身份。",
832
+ "capability.presets.uncertain": "结果未知;请刷新并检查预设,再决定是否重试。",
833
+ "capability.presets.missingSelection": "草稿选择不完整;请刷新后再保存。",
834
+ "capability.presets.replaceTarget": "确认替换 {scope} 范围内 ID {id}、修订 {revision} 的预设?",
835
+ "capability.presets.noneKnown": "无已报告项",
836
+ "capability.presets.importPartial": "已安装的技能:{names}。预设状态尚未确认。请检查已安装文件并刷新预设,再决定如何恢复。",
837
+ "capability.presets.currentRevision": " 当前存储修订:{revision}。",
838
+ "capability.presets.revisionConflict": "已在别处变更——列表已刷新。",
839
+ "capability.presets.noWorkspace": "此会话没有工作区。",
840
+ "capability.presets.saveFailed": "预设保存失败。",
841
+ "capability.presets.loaded": "已装入草稿——应用后生效。",
842
+ "capability.presets.loadedUnresolved": "已装入草稿——报告 {n} 个未解析引用。",
843
+ "capability.presets.loadFailed": "载入失败——预设可能已不存在。",
844
+ "capability.presets.deleted": "预设已删除。",
845
+ "capability.presets.deleteFailed": "删除失败。",
846
+ "capability.presets.exportFailed": "导出失败。",
847
+ "capability.presets.imported": "已导入:{bound} 个 MCP 绑定,{unresolved} 个未解析引用。",
848
+ "capability.presets.counts": "{skills} 个技能 · {mcp} 个 MCP",
849
+ "capability.presets.countsUnresolved": " · {n} 个未解析",
850
+ "capability.presets.loading": "正在载入…",
851
+ "capability.presets.load": "载入",
852
+ "capability.presets.export": "导出",
853
+ "capability.presets.delete": "删除",
854
+ "capability.presets.deleteConfirm": "删除预设“{name}”?此操作不可撤销。",
855
+ "capability.presets.deleteConfirmButton": "删除预设",
856
+ "capability.presets.deleting": "正在删除…",
857
+ "capability.presets.cancel": "取消",
858
+ "capability.presets.exportLabel": "预设 JSON",
859
+ "capability.presets.copy": "复制到剪贴板",
860
+ "capability.presets.copied": "已复制",
861
+ "capability.presets.close": "关闭",
862
+ "capability.presets.saveOpen": "存为预设…",
863
+ "capability.presets.importOpen": "导入…",
864
+ "capability.presets.name": "预设名称",
865
+ "capability.presets.namespace": "命名空间",
866
+ "capability.presets.scopeWorkspace": "工作区",
867
+ "capability.presets.scopeGlobal": "全局",
868
+ "capability.presets.source": "来源",
869
+ "capability.presets.fromDraft": "当前草稿",
870
+ "capability.presets.fromApplied": "已应用的选择",
871
+ "capability.presets.nameConflict": "此命名空间中已存在名为“{name}”的预设。",
872
+ "capability.presets.rename": "改名…",
873
+ "capability.presets.renameHint": "修改名称后重新保存。",
874
+ "capability.presets.replace": "替换它",
875
+ "capability.presets.saving": "正在保存…",
876
+ "capability.presets.save": "保存预设",
877
+ "capability.presets.importPlaceholder": "粘贴便携式预设文档(JSON)…",
878
+ "capability.presets.importing": "正在导入…",
879
+ "capability.presets.importSubmit": "导入",
880
+ "capability.presets.importInvalidJson": "不是有效的 JSON——未写入任何内容。",
881
+ "capability.presets.importRejected": "已拒绝:{reason}——未写入任何内容。",
882
+ "capability.presets.importNameConflict": "此处已存在同名预设。",
883
+ "capability.presets.importFailed": "导入失败——未写入任何内容。",
884
+ "capability.presets.groupWorkspace": "工作区预设",
885
+ "capability.presets.groupWorkspaceNone": "工作区预设(无工作区)",
886
+ "capability.presets.groupGlobal": "全局预设",
887
+ "capability.presets.emptyWorkspace": "暂无工作区预设。",
888
+ "capability.presets.emptyGlobal": "暂无全局预设。",
889
+ "capability.presets.defaultTitle": "新会话的工作区默认值",
890
+ "capability.presets.defaultUnavailable": "工作区默认值不可用。",
891
+ "capability.presets.defaultNone": "未设置默认值——新会话使用内置基线。",
892
+ "capability.presets.defaultEmpty": "已设置显式空默认:新会话以 0 个技能 · 0 个 MCP 开始。",
893
+ "capability.presets.defaultEntries": "默认值:{counts}",
894
+ "capability.presets.defaultUnresolved": "……解析时报告 {n} 个未解析引用。",
895
+ "capability.presets.defaultSaveOpen": "存为默认值…",
896
+ "capability.presets.defaultClearOpen": "清除默认值…",
897
+ "capability.presets.defaultSaveConfirm": "将 {counts} 存为此工作区的默认值?此工作区的新会话将从它开始;当前会话不变。",
898
+ "capability.presets.defaultSaveConfirmButton": "保存默认值",
899
+ "capability.presets.defaultSaved": "工作区默认值已保存。",
900
+ "capability.presets.defaultSaveFailed": "默认值保存失败。",
901
+ "capability.presets.defaultClearConfirm": "清除工作区默认值?新会话回到内置基线;已打开的会话不变。",
902
+ "capability.presets.defaultClearConfirmButton": "清除默认值",
903
+ "capability.presets.defaultCleared": "工作区默认值已清除——新会话使用内置基线。",
904
+ "capability.presets.defaultClearFailed": "默认值清除失败。",
905
+ "capability.presets.clearing": "正在清除…",
906
+ "capability.presets.needsReceipt": "会话回执载入前不可用。",
907
+ "capability.presets.exportDownload": "下载 .json",
908
+ "capability.presets.downloaded": "已下载",
909
+ "capability.presets.importedPackage": "已导入:安装 {installed} 个技能,{bound} 个 MCP 绑定,{unresolved} 个未解析引用。",
910
+ "capability.presets.importSummaryTitle": "导入摘要——写入前请核对",
911
+ "capability.presets.importFiles": "{n} 个文件",
912
+ "capability.presets.importNoInstalls": "此包不包含需要安装的技能。",
913
+ "capability.presets.importUnresolvedTitle": "未解析引用——不会安装:",
914
+ "capability.presets.importCollision": "名称冲突",
915
+ "capability.presets.importCollisionDecision": "当打包技能名称已存在时:",
916
+ "capability.presets.collisionCancel": "跳过它(默认)",
917
+ "capability.presets.collisionReplace": "替换它",
918
+ "capability.presets.collisionCoexist": "共存(自动改名)",
919
+ "capability.presets.importConfirm": "确认导入",
920
+ "capability.presets.importResultTitle": "导入结果",
921
+ "capability.presets.importInstalledNote": "已安装的技能保持未勾选——在草稿中勾选并应用后生效。",
922
+ "capability.presets.importInstallFailed": "安装失败:{reason}——已回滚 {n} 个文件;未创建预设。",
923
+ "capability.presets.importNoTargetRoot": "此宿主没有可用的 {scope} 技能根目录——未安装任何内容。",
924
+ "capability.presets.scopeProject": "工作区",
925
+ "capability.presets.scopeUser": "用户",
926
+ "capability.loading": "正在加载能力…",
927
+ unavailable: "此插件未加载,当前无法配置。",
928
+ save: "保存",
929
+ },
930
+ };
931
+
932
+ exports.dictionaries = dictionaries;
584
933
  exports.skillIdentityKeyOf = skillIdentityKeyOf;
585
934
  exports.skillEntryKeyOf = skillEntryKeyOf;
586
935
  exports.badgeStateOf = badgeStateOf;
587
936
  exports.skillRowOf = skillRowOf;
588
937
  exports.partitionManagerListing = partitionManagerListing;
589
938
  exports.managerConditionState = managerConditionState;
590
- exports.commitStateOf = commitStateOf;
591
- exports.closeDirtyDraft = closeDirtyDraft;
592
939
  exports.frameRefreshesSession = frameRefreshesSession;
593
940
  exports.draftFromReceipt = draftFromReceipt;
594
941
  exports.draftAfterRefresh = draftAfterRefresh;
@@ -40,6 +40,86 @@ window.__ModuleLoader__.load({
40
40
  }
41
41
  return JSON.stringify(out, null, 2);
42
42
  }
43
+ // Locale data face (pure data, NO ctx calls — a chunk factory re-executes
44
+ // under HMR, so a chunk-local register would throw on the duplicate
45
+ // (namespace, locale) pair): the entry registers these under "settings.weir.page"
46
+ // inside a ctx.effect when this chunk arrives (lib/client.js
47
+ // registerChunkDictionaries). Pinned by test/client.test.js's dictionary
48
+ // union pin.
49
+ // (The entry merges every settings-batch slice into the single "settings.weir.page"
50
+ // registration — the whole settings card tree shares one t.)
51
+ const dictionaries = {
52
+ en: {
53
+ chainAgent_finder: "Finder",
54
+ chainAgent_finder_desc: "Contextual codebase search: answers \"where is X?\" and \"find the code that does Z\". Read-only, fast, parallel-first.",
55
+ chainAgent_scholar: "Scholar",
56
+ chainAgent_scholar_desc: "Documentation and OSS research: official docs, library APIs, best practices, real-world usage. Read-only.",
57
+ chainAgent_advisor: "Advisor",
58
+ chainAgent_advisor_desc: "Architecture and design advisor: module boundaries, decomposition, trade-offs. Read-only, high reasoning.",
59
+ chainAgentPanelHint: "One row per curated agent; empty inherits the caller's route, fallbacks are tried in order.",
60
+ chainEdit: "Edit",
61
+ chainPanelHint: "One row per category: Edit picks the models, fallbacks are tried in order; an empty row follows the session model.",
62
+ chainSave: "Save",
63
+ chainCancel: "Cancel",
64
+ chainAddRung: "Add fallback",
65
+ chainRemove: "Remove",
66
+ chainClear: "Clear (inherit)",
67
+ chainCategory_quick: "Quick",
68
+ chainCategory_quick_desc: "Trivial mechanical work: single-file changes, typo fixes, boilerplate.",
69
+ chainCategory_deep: "Deep",
70
+ chainCategory_deep_desc: "One goal, one deliverable: debugging, cross-module work, subtle logic.",
71
+ "chainCategory_deep-plus": "Deep plus",
72
+ "chainCategory_deep-plus_desc": "Escalation lane: trade-offs, contracts, invariants evidence cannot settle.",
73
+ chainCategory_visual: "Visual",
74
+ chainCategory_visual_desc: "Frontend, UI/UX, styling, animation, layout.",
75
+ chainCategory_writing: "Writing",
76
+ chainCategory_writing_desc: "Documentation, prose, technical writing, README and guides.",
77
+ "chainCategory_general-low": "General (light)",
78
+ "chainCategory_general-low_desc": "Small tasks that fit no other category.",
79
+ "chainCategory_general-high": "General (standard)",
80
+ "chainCategory_general-high_desc": "Standard features spanning a few files with known patterns.",
81
+ chainCategory_artistry: "Artistry",
82
+ chainCategory_artistry_desc: "Highly creative or artistic tasks, novel ideas, design exploration.",
83
+ chainCategory_architect: "Architect",
84
+ chainCategory_architect_desc: "Advisory architecture consult: boundaries, decomposition, trade-offs (read-only).",
85
+ },
86
+ zh: {
87
+ chainAgent_finder: "finder(检索)",
88
+ chainAgent_finder_desc: "代码库上下文检索:回答「X 在哪里」「做 Z 的代码在哪」。只读、快速、并行优先。",
89
+ chainAgent_scholar: "scholar(调研)",
90
+ chainAgent_scholar_desc: "文档与 OSS 调研:官方文档、库 API、最佳实践、真实用法。只读。",
91
+ chainAgent_advisor: "advisor(架构)",
92
+ chainAgent_advisor_desc: "架构与设计顾问:模块边界、拆分、权衡。只读、高推理。",
93
+ chainAgentPanelHint: "每个精选代理一行;留空继承调用方路由,备选按序回退。",
94
+ chainEdit: "编辑",
95
+ chainPanelHint: "每个类别一行:点「编辑」挑选模型,可添加备选按序回退;留空的类别跟随会话模型。",
96
+ chainSave: "保存",
97
+ chainCancel: "取消",
98
+ chainAddRung: "添加备选",
99
+ chainRemove: "删除",
100
+ chainClear: "清空(跟随会话)",
101
+ chainCategory_quick: "quick(快活)",
102
+ chainCategory_quick_desc: "机械性小活:单文件修改、错别字、样板代码。",
103
+ chainCategory_deep: "deep(攻坚)",
104
+ chainCategory_deep_desc: "一个目标一个交付物:调试、跨模块、微妙逻辑。",
105
+ "chainCategory_deep-plus": "deep-plus(升级)",
106
+ "chainCategory_deep-plus_desc": "升级车道:证据无法定夺的权衡、契约、不变量。",
107
+ chainCategory_visual: "visual(视觉)",
108
+ chainCategory_visual_desc: "前端、UI/UX、样式、动画、布局。",
109
+ chainCategory_writing: "writing(写作)",
110
+ chainCategory_writing_desc: "文档、散文、技术写作、README 与指南。",
111
+ "chainCategory_general-low": "general-low(通用·轻量)",
112
+ "chainCategory_general-low_desc": "不属于任何专业类别的小任务。",
113
+ "chainCategory_general-high": "general-high(通用·标准)",
114
+ "chainCategory_general-high_desc": "跨几个文件、有既定模式的标准特性。",
115
+ chainCategory_artistry: "artistry(艺术)",
116
+ chainCategory_artistry_desc: "高度创意或艺术性任务、新颖想法、设计探索。",
117
+ chainCategory_architect: "architect(架构)",
118
+ chainCategory_architect_desc: "咨询式架构评估:模块边界、拆分、权衡(只读)。",
119
+ },
120
+ };
121
+
122
+ exports.dictionaries = dictionaries;
43
123
  exports.CHAIN_CATEGORIES = CHAIN_CATEGORIES;
44
124
  exports.jsonToChains = jsonToChains;
45
125
  exports.chainsToJson = chainsToJson;
@@ -120,6 +120,28 @@ window.__ModuleLoader__.load({
120
120
  ] }) : null
121
121
  ] });
122
122
  }
123
+ // Locale data face (pure data, NO ctx calls — a chunk factory re-executes
124
+ // under HMR, so a chunk-local register would throw on the duplicate
125
+ // (namespace, locale) pair): the entry registers these under "settings.weir.page"
126
+ // inside a ctx.effect when this chunk arrives (lib/client.js
127
+ // registerChunkDictionaries). Pinned by test/client.test.js's dictionary
128
+ // union pin.
129
+ // (The entry merges every settings-batch slice into the single "settings.weir.page"
130
+ // registration — the whole settings card tree shares one t.)
131
+ const dictionaries = {
132
+ en: {
133
+ disabledCategoriesCount: "disabled",
134
+ disabledCategoriesPanelHint: "One switch per category; saving writes exactly the switched-on names — all off disables nothing.",
135
+ disabledCategoriesInvalid: "The stored value is not a valid category list; the editor opened with every category off — saving replaces it.",
136
+ },
137
+ zh: {
138
+ disabledCategoriesCount: "个已停用",
139
+ disabledCategoriesPanelHint: "每个类别一个开关;保存只写入打开的类别,全部关闭即不停用任何类别。",
140
+ disabledCategoriesInvalid: "已保存的值不是有效的类别清单;编辑器已以全部关闭打开,保存将覆盖该值。",
141
+ },
142
+ };
143
+
144
+ exports.dictionaries = dictionaries;
123
145
  exports.DisabledCategoriesEditorField = DisabledCategoriesEditorField;
124
146
  return module.exports;
125
147
  }