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.
- package/cordis.patch.yml +0 -2
- package/lib/client.blackboard-model.js +172 -56
- package/lib/client.capability-manager.js +0 -1
- package/lib/client.capability-model.js +378 -31
- package/lib/client.chain-model.js +80 -0
- package/lib/client.disabled-categories-editor.js +22 -0
- package/lib/client.edit-lock-maintenance.js +239 -246
- package/lib/client.edit-lock-panel.js +110 -0
- package/lib/client.hash-edit-model.js +48 -0
- package/lib/client.js +267 -1549
- package/lib/client.lsp-model.js +92 -0
- package/lib/client.lsp-panel.js +11 -16
- package/lib/client.lsp-toggle.js +18 -0
- package/lib/client.notify-permissions.js +112 -20
- package/lib/client.notify-web.js +14 -11
- package/lib/client.robash-model.js +26 -0
- package/lib/client.settings-page.js +287 -17
- package/lib/client.worktree-model.js +225 -0
- package/package.json +5 -2
- package/src/blackboard/durable.js +12 -0
- package/src/blackboard/index.js +2 -2
- package/src/blackboard/kernel.js +23 -6
- package/src/blackboard/notify.js +10 -3
- package/src/blackboard/remote.js +31 -13
- package/src/blackboard/storage.js +13 -5
- package/src/capabilities/apply-engine.js +189 -101
- package/src/capabilities/defaults-transaction.js +136 -1
- package/src/capabilities/lifecycle-snapshot.js +83 -204
- package/src/capabilities/mcp-admission.js +1 -23
- package/src/capabilities/mcp-drain.js +30 -19
- package/src/capabilities/mcp-facade.js +23 -3
- package/src/capabilities/preset-library.js +247 -0
- package/src/capabilities/preset-package.js +212 -1
- package/src/capabilities/same-name-policy.js +3 -41
- package/src/capabilities/selection-notify.js +324 -21
- package/src/capabilities/skill-office-adapter.js +7 -1
- package/src/capabilities/skill-selection-plugin.js +315 -729
- package/src/capabilities/store/checked-contract.d.ts +5 -0
- package/src/capabilities/store/fs-adapter.js +52 -0
- package/src/capabilities/store/lock.js +86 -0
- package/src/capabilities/store/paths.js +5 -0
- package/src/capabilities/store/store.js +105 -5
- package/src/creative-guide/guide.js +1 -1
- package/src/delegate/child-composition.js +258 -0
- package/src/delegate/group-coordinator.js +25 -27
- package/src/delegate/index.js +21 -2
- package/src/delegate/rehydrate.js +24 -4
- package/src/delegate/robash-guard-core.js +2 -2
- package/src/delegate/spawn-adapter.js +214 -100
- package/src/delegate/status-tool.js +9 -6
- package/src/delegate/supervision-mount.js +35 -6
- package/src/delegate/tool.js +29 -4
- package/src/{shared → delegate}/whitelist-defaults.js +2 -2
- package/src/edit-lock/admin-ledger.js +8 -11
- package/src/edit-lock/admin-recovery.js +2 -1
- package/src/edit-lock/admission.js +12 -2
- package/src/edit-lock/binding-guidance.js +28 -10
- package/src/edit-lock/binding-machine.js +312 -0
- package/src/edit-lock/derived-facts.js +67 -0
- package/src/edit-lock/index.js +44 -244
- package/src/edit-lock/inspect.js +113 -1
- package/src/edit-lock/lifecycle.js +8 -5
- package/src/edit-lock/limits.js +61 -0
- package/src/edit-lock/maintenance.js +5 -2
- package/src/edit-lock/manager.js +6 -2
- package/src/edit-lock/operation-history.js +1 -1
- package/src/edit-lock/peer-client.js +9 -2
- package/src/edit-lock/peer-transport.js +7 -1
- package/src/edit-lock/remote.js +11 -4
- package/src/edit-lock/state.js +2 -4
- package/src/edit-lock/view.js +10 -11
- package/src/lsp/admin.js +2 -24
- package/src/lsp/index.js +1 -1
- package/src/lsp/manager.js +1 -1
- package/src/notify/permissions-admin.js +1 -1
- package/src/{lsp/child-process.js → process/index.js} +23 -6
- package/src/settings/env-admin.js +1 -1
- package/src/settings/index.js +1 -1
- package/src/settings/sections.js +0 -54
- package/src/shared/audit.js +12 -0
- package/src/shared/child-scope.js +3 -1
- package/src/shared/http-json.js +28 -0
- package/src/{delegate/audit-readers.js → shared/terminal-evidence.js} +34 -4
- package/src/worktree/errors.js +3 -0
- package/src/worktree/index.js +1 -2
- package/src/worktree/lane-core.js +641 -0
- package/src/worktree/lane-views.js +147 -0
- package/src/worktree/lane-workflows.js +853 -0
- package/src/worktree/lanes.js +24 -1513
- package/src/worktree/runner.js +5 -4
- package/src/capabilities/content-pin.js +0 -88
- package/src/capabilities/content-refresh.js +0 -331
- package/src/capabilities/distribution-manifest.js +0 -78
- package/src/capabilities/isolated-exec.js +0 -106
- package/src/capabilities/publisher.js +0 -129
- package/src/capabilities/skill-admission.js +0 -181
- package/src/capabilities/update-lifecycle.js +0 -106
- package/src/edit-lock/remote-service.js +0 -28
- package/src/worktree/contract-guidance.test.js +0 -100
|
@@ -21,9 +21,10 @@ window.__ModuleLoader__.load({
|
|
|
21
21
|
// a verbatim copy of the entry constant (same-package sync require is
|
|
22
22
|
// impossible in the ModuleLoader).
|
|
23
23
|
const WEIR_NS = "weir-settings";
|
|
24
|
-
// Host environment
|
|
25
|
-
//
|
|
26
|
-
|
|
24
|
+
// Host environment facts (src/settings/env-admin.js) arrive through
|
|
25
|
+
// deps.fetchEnv — the composition root's HTTP-channel-backed read; this
|
|
26
|
+
// chunk keeps the failure policy (warn-once) but no longer builds the
|
|
27
|
+
// carrier.
|
|
27
28
|
// Environment fact names a `when` condition may reference. Keep in sync
|
|
28
29
|
// with the facts the endpoint answers (platform today); validateLayout
|
|
29
30
|
// fails module load on any other name.
|
|
@@ -482,17 +483,6 @@ window.__ModuleLoader__.load({
|
|
|
482
483
|
envFailureWarned = true;
|
|
483
484
|
console.warn(`weir-settings: environment facts unavailable — env-gated rows stay hidden (${String(error?.message ?? error)})`);
|
|
484
485
|
}
|
|
485
|
-
function fetchEnvFacts() {
|
|
486
|
-
return fetch(ENV_PATH, {
|
|
487
|
-
method: "POST",
|
|
488
|
-
credentials: "include",
|
|
489
|
-
headers: { "content-type": "application/json" },
|
|
490
|
-
body: "{}"
|
|
491
|
-
}).then((response) => response.json()).then((payload) => {
|
|
492
|
-
if (payload?.ok !== true || typeof payload.value?.platform !== "string") throw new Error("malformed environment facts response");
|
|
493
|
-
return { platform: payload.value.platform };
|
|
494
|
-
});
|
|
495
|
-
}
|
|
496
486
|
var WeirCardController = class {
|
|
497
487
|
form;
|
|
498
488
|
store;
|
|
@@ -505,8 +495,8 @@ window.__ModuleLoader__.load({
|
|
|
505
495
|
// Prop-injected dependencies: the entry-owned settings bus (save →
|
|
506
496
|
// toggle re-check) and a getSession closure resolving the
|
|
507
497
|
// remote.session domain lazily at call time (it may not be wired
|
|
508
|
-
// yet during apply, S17). fetchEnv is the
|
|
509
|
-
// facts read
|
|
498
|
+
// yet during apply, S17). fetchEnv is the composition root's
|
|
499
|
+
// channel-backed environment-facts read.
|
|
510
500
|
this.deps = deps;
|
|
511
501
|
this.form = new primitives.SettingsFormModel(scope, this.fields.map(specFor));
|
|
512
502
|
this.store = this.form.bind(() => this.projection());
|
|
@@ -521,7 +511,7 @@ window.__ModuleLoader__.load({
|
|
|
521
511
|
// console warning — the rest of the page stays usable.
|
|
522
512
|
this.env = { status: "pending", facts: {} };
|
|
523
513
|
Promise.resolve()
|
|
524
|
-
.then(() =>
|
|
514
|
+
.then(() => deps.fetchEnv())
|
|
525
515
|
.then(
|
|
526
516
|
(facts) => {
|
|
527
517
|
this.env = { status: "ready", facts: facts ?? {} };
|
|
@@ -1034,6 +1024,286 @@ window.__ModuleLoader__.load({
|
|
|
1034
1024
|
style: columnStyle,
|
|
1035
1025
|
children: renderSlot(slot ?? ITEM_SLOT)
|
|
1036
1026
|
});
|
|
1027
|
+
// Locale data face (pure data, NO ctx calls — a chunk factory re-executes
|
|
1028
|
+
// under HMR, so a chunk-local register would throw on the duplicate
|
|
1029
|
+
// (namespace, locale) pair): the entry registers these under "settings.weir.page"
|
|
1030
|
+
// inside a ctx.effect when this chunk arrives (lib/client.js
|
|
1031
|
+
// registerChunkDictionaries). Pinned by test/client.test.js's dictionary
|
|
1032
|
+
// union pin.
|
|
1033
|
+
const dictionaries = {
|
|
1034
|
+
en: {
|
|
1035
|
+
description: "One-stop configuration for the Weir preset: intent classification, auto-continuation, context pressure, file editing, worktree lanes, read-only shell, LSP, and notifications; model routing is a separate page.",
|
|
1036
|
+
routingDescription: "Which models delegated children run on: per task category or curated agent, with ordered fallbacks.",
|
|
1037
|
+
unavailable: "This plugin is not loaded, so it cannot be configured right now.",
|
|
1038
|
+
readOnly: "This deployment stores settings read-only.",
|
|
1039
|
+
saveFailed: "The deployment did not accept these values; they were left for you to correct.",
|
|
1040
|
+
save: "Save",
|
|
1041
|
+
saving: "Saving…",
|
|
1042
|
+
pendingChanges: "{n} unsaved change(s)",
|
|
1043
|
+
discardChanges: "Discard",
|
|
1044
|
+
overridden: "Overridden",
|
|
1045
|
+
reset: "Reset to default",
|
|
1046
|
+
restartRequired: "Restart required",
|
|
1047
|
+
invalidValue: "Enter a value this field accepts, or leave blank to use the default.",
|
|
1048
|
+
restartReminderTitle: "Restart to apply",
|
|
1049
|
+
restartReminderBody: "These settings changed and take effect after restarting DeepSeek Harness. Everything else you saved is already live.",
|
|
1050
|
+
restartReminderDismiss: "Dismiss",
|
|
1051
|
+
restartReminderAcknowledge: "Got it",
|
|
1052
|
+
catalogLoading: "Loading providers…",
|
|
1053
|
+
pickerModel: "Model",
|
|
1054
|
+
pickerEffort: "Reasoning",
|
|
1055
|
+
effortProviderDefault: "Provider default",
|
|
1056
|
+
catalogFailed: "Provider catalog unavailable; enter provider and model manually.",
|
|
1057
|
+
providerEmpty: "Select a provider",
|
|
1058
|
+
modelEmpty: "Select a model",
|
|
1059
|
+
pickerUnavailable: "Model picker unavailable — reload the settings page to retry.",
|
|
1060
|
+
groupIntent: "Intent",
|
|
1061
|
+
groupTodo: "Auto-continuation",
|
|
1062
|
+
groupGuard: "Context pressure",
|
|
1063
|
+
groupEditing: "File editing",
|
|
1064
|
+
groupWorktree: "Worktree lanes",
|
|
1065
|
+
groupRobash: "Read-only shell",
|
|
1066
|
+
groupLsp: "LSP",
|
|
1067
|
+
groupNotify: "Notifications",
|
|
1068
|
+
groupRoutingCategories: "Task categories",
|
|
1069
|
+
groupRoutingAgents: "Curated agents",
|
|
1070
|
+
groupRoutingSupervision: "Supervision and retries",
|
|
1071
|
+
intentGateClassifierOptionRegex: "regex",
|
|
1072
|
+
intentGateClassifierOptionLlm: "llm",
|
|
1073
|
+
intentGateClassifierOptionJev: "jev",
|
|
1074
|
+
intentGateClassifier: "Intent classifier",
|
|
1075
|
+
intentGateClassifierHint: "How each message's intent is detected: regex uses built-in rules at zero cost (default); llm uses a small dedicated model; jev is experimental.",
|
|
1076
|
+
intentGateProvider: "Classifier model (llm mode)",
|
|
1077
|
+
intentGateProviderHint: "A dedicated model for semantic classification; blank follows the session model.",
|
|
1078
|
+
intentGateModel: "Classifier model name (llm mode)",
|
|
1079
|
+
intentGateModelHint: "Blank follows the session route's model.",
|
|
1080
|
+
intentGateReasoningEffort: "Classifier reasoning effort (llm mode)",
|
|
1081
|
+
intentGateReasoningEffortHint: "Blank follows the model default.",
|
|
1082
|
+
intentGateTimeoutMs: "Classifier timeout (ms)",
|
|
1083
|
+
intentGateTimeoutMsHint: "On timeout the rule-based result is used; the message is never blocked (default 1500).",
|
|
1084
|
+
jevEndpoint: "Jev endpoint",
|
|
1085
|
+
jevEndpointHint: "Jev decisions service URL (experimental mode).",
|
|
1086
|
+
jevModel: "Jev model",
|
|
1087
|
+
jevModelHint: "Model name for Jev (default jev).",
|
|
1088
|
+
jevApiKeyEnv: "Jev API key env var",
|
|
1089
|
+
jevApiKeyEnvHint: "Environment variable name holding the Jev API key; the key itself never enters config.",
|
|
1090
|
+
delegateCategoryChains: "Category models",
|
|
1091
|
+
delegateCategoryChainsHint: "The model children of each task category run on; add fallbacks tried in order, or leave empty to follow the session model.",
|
|
1092
|
+
delegateAgentChains: "Curated agent models",
|
|
1093
|
+
delegateAgentChainsHint: "The model each curated agent (finder, scholar, advisor) runs on; empty inherits the caller's route.",
|
|
1094
|
+
delegateDisabledCategories: "Disabled categories",
|
|
1095
|
+
delegateDisabledCategoriesHint: "Disabled categories leave the delegation list and can no longer be delegated to.",
|
|
1096
|
+
supervisionMaxRetries: "Child retry limit",
|
|
1097
|
+
supervisionMaxRetriesHint: "How many times a supervised child is continued when it ends without a report or keeps failing (default 5).",
|
|
1098
|
+
supervisionInitialBackoffMs: "Initial retry backoff (ms)",
|
|
1099
|
+
supervisionInitialBackoffMsHint: "Wait before the first retry; doubles each round (default 30000).",
|
|
1100
|
+
supervisionMaxBackoffMs: "Maximum retry backoff (ms)",
|
|
1101
|
+
supervisionMaxBackoffMsHint: "The retry wait never grows past this (default 300000).",
|
|
1102
|
+
todoEnabled: "Auto-continuation",
|
|
1103
|
+
todoEnabledHint: "With unfinished todos the assistant keeps going without waiting for your message (default on).",
|
|
1104
|
+
todoMaxConsecutive: "Continuation limit",
|
|
1105
|
+
todoMaxConsecutiveHint: "At most this many consecutive auto-continuations without your input (default 8).",
|
|
1106
|
+
todoErrorRetryMax: "Error retry limit",
|
|
1107
|
+
todoErrorRetryMaxHint: "How many times a provider error is retried automatically (default 5).",
|
|
1108
|
+
guardEnabled: "Context pressure guard",
|
|
1109
|
+
guardEnabledHint: "As the context fills up, asks the assistant to wrap up and requests compaction before it overflows; applies immediately.",
|
|
1110
|
+
guardSoftThreshold: "Advisory threshold",
|
|
1111
|
+
guardSoftThresholdHint: "Above this fill ratio the assistant is asked to wrap up (default 0.72; must stay below the compaction threshold).",
|
|
1112
|
+
guardHardThreshold: "Compaction threshold",
|
|
1113
|
+
guardHardThresholdHint: "Above this fill ratio compaction is requested (default 0.88; not a completion guarantee).",
|
|
1114
|
+
hashlineHideStockEdit: "Anchor editing only",
|
|
1115
|
+
hashlineHideStockEditHint: "Hides the built-in edit tool; file edits go through hash_edit anchors only.",
|
|
1116
|
+
editLockEnabled: "Edit Lock",
|
|
1117
|
+
editLockEnabledHint: "Sessions take turns editing the same files instead of overwriting each other.",
|
|
1118
|
+
editLockOptOutWarning: "Edit Lock is set to off. After saving, restart DeepSeek Harness to apply the change. Once enforcement is off, ordinary editing is UNPROTECTED and can overwrite another session's work. Old fences and history are retained and may block files when you re-enable Edit Lock.",
|
|
1119
|
+
editLockAutoResume: "Message resumes editing",
|
|
1120
|
+
editLockAutoResumeHint: "After a session is stopped, sending any message restores its editing right and re-confirms its kept files (default on).",
|
|
1121
|
+
editLockStaleSweep: "Sweep stale locks",
|
|
1122
|
+
editLockStaleSweepHint: "Locks whose target file was deleted or moved are re-verified and released as you send messages (default on).",
|
|
1123
|
+
worktreeEnabled: "Worktree lanes",
|
|
1124
|
+
worktreeEnabledHint: "Lets the assistant work in isolated git worktrees: lane tools, the /worktree command, and the lanes panel.",
|
|
1125
|
+
worktreeAutoSetup: "Auto-install in new lanes",
|
|
1126
|
+
worktreeAutoSetupHint: "Runs the repository's configured install command when a lane opens (default on).",
|
|
1127
|
+
worktreeMaxActive: "Active lane limit",
|
|
1128
|
+
worktreeMaxActiveHint: "At most this many active lanes per repository (default 4).",
|
|
1129
|
+
worktreeRoot: "Lane directory",
|
|
1130
|
+
worktreeRootHint: "Repository-relative directory holding lanes (default .weir/worktrees; locally git-ignored).",
|
|
1131
|
+
worktreeWatchTimeoutMinutes: "Lane watch timeout (minutes)",
|
|
1132
|
+
worktreeWatchTimeoutMinutesHint: "A lane-state watch expires with one notice after this long without a hit (default 360); existing watches keep their deadline.",
|
|
1133
|
+
worktreeAutoApprove: "Lane auto-approve",
|
|
1134
|
+
worktreeAutoApproveHint: "Default approval mode for new sessions: manual asks every time; auto-keep approves and keeps the branch; auto-clean also deletes it; /worktree approve overrides per session.",
|
|
1135
|
+
worktreeAutoApproveOptionManual: "manual",
|
|
1136
|
+
"worktreeAutoApproveOptionAuto-keep": "auto-keep",
|
|
1137
|
+
"worktreeAutoApproveOptionAuto-clean": "auto-clean",
|
|
1138
|
+
robashEnabled: "Read-only shell guard",
|
|
1139
|
+
robashEnabledHint: "Curated read-only agents (finder etc.) may only run allow-listed read-only commands (default on).",
|
|
1140
|
+
robashAllow: "Extra allowed commands",
|
|
1141
|
+
robashAllowHint: "Command names added on top of the built-in allow list; built-ins always apply, empty adds nothing.",
|
|
1142
|
+
robashGitAllow: "Extra allowed git subcommands",
|
|
1143
|
+
robashGitAllowHint: "Git subcommands added on top of the built-in list (shared with the pwsh gate); empty adds nothing.",
|
|
1144
|
+
robashDeny: "Extra denied commands",
|
|
1145
|
+
robashDenyHint: "Command names added on top of the built-in deny list; deny wins over allow.",
|
|
1146
|
+
robashPwshAllow: "Extra allowed pwsh commands",
|
|
1147
|
+
robashPwshAllowHint: "Additions to the Windows read-only pwsh allow list; built-ins always apply.",
|
|
1148
|
+
robashPwshDeny: "Extra denied pwsh commands",
|
|
1149
|
+
robashPwshDenyHint: "Additions to the Windows read-only pwsh deny list; deny wins over allow.",
|
|
1150
|
+
lspEnabled: "LSP semantic tools",
|
|
1151
|
+
lspEnabledHint: "When on, each session can enable go-to-definition, find-references and friends from its composer switch (sessions start off).",
|
|
1152
|
+
lspServers: "Custom language servers",
|
|
1153
|
+
lspServersHint: "Add language servers beyond the built-in catalog, edited visually in the manager panel.",
|
|
1154
|
+
notifyEnabled: "System notifications",
|
|
1155
|
+
notifyEnabledHint: "Sends a system notification when a session needs you or a turn finishes (default on).",
|
|
1156
|
+
notifyOnComplete: "Notify on completion",
|
|
1157
|
+
notifyOnCompleteHint: "Notifies when a turn finishes and ran longer than the minimum below.",
|
|
1158
|
+
notifyOnAttention: "Notify when needed",
|
|
1159
|
+
notifyOnAttentionHint: "Notifies on approval requests, questions, plan reviews, and failed or stopped turns.",
|
|
1160
|
+
notifyMinTurnSeconds: "Minimum turn length (seconds)",
|
|
1161
|
+
notifyMinTurnSecondsHint: "A finished turn is only reported when it ran at least this long; 0 reports every turn (default 15).",
|
|
1162
|
+
notifySound: "Notification sound",
|
|
1163
|
+
notifySoundHint: "Plays the platform notification sound where supported.",
|
|
1164
|
+
notifyForeground: "When the window is in front",
|
|
1165
|
+
notifyForegroundHint: "Whether to notify while the window is in the foreground: don't notify (default) or always notify.",
|
|
1166
|
+
notifyForegroundOptionSkip: "Don't notify",
|
|
1167
|
+
notifyForegroundOptionAlways: "Always notify",
|
|
1168
|
+
},
|
|
1169
|
+
zh: {
|
|
1170
|
+
description: "Weir 预设的一站式配置:意图分类、自动续推、上下文压力、文件编辑、Worktree 车道、只读命令行、LSP 与系统通知;模型路由为独立页面。",
|
|
1171
|
+
routingDescription: "委派给子代理的模型:按任务类别或精选代理指定,可设备选按序回退。",
|
|
1172
|
+
unavailable: "此插件未加载,当前无法配置。",
|
|
1173
|
+
readOnly: "此部署的设置为只读。",
|
|
1174
|
+
saveFailed: "部署未接受这些值,已保留供你修正。",
|
|
1175
|
+
save: "保存",
|
|
1176
|
+
saving: "保存中…",
|
|
1177
|
+
pendingChanges: "{n} 项未保存的更改",
|
|
1178
|
+
discardChanges: "放弃更改",
|
|
1179
|
+
overridden: "已覆盖",
|
|
1180
|
+
reset: "恢复默认",
|
|
1181
|
+
restartRequired: "需重启",
|
|
1182
|
+
invalidValue: "请输入该字段接受的值,或留空以使用默认值。",
|
|
1183
|
+
restartReminderTitle: "重启后生效",
|
|
1184
|
+
restartReminderBody: "以下设置已更改,重启 DeepSeek Harness 后才会生效;本次保存的其它改动已即时生效。",
|
|
1185
|
+
restartReminderDismiss: "知道了",
|
|
1186
|
+
restartReminderAcknowledge: "知道了",
|
|
1187
|
+
catalogLoading: "正在加载 provider…",
|
|
1188
|
+
pickerModel: "模型",
|
|
1189
|
+
pickerEffort: "推理",
|
|
1190
|
+
effortProviderDefault: "跟随 provider 默认",
|
|
1191
|
+
catalogFailed: "Provider 目录不可用;可手动填写 provider 与模型。",
|
|
1192
|
+
providerEmpty: "选择 provider",
|
|
1193
|
+
modelEmpty: "选择模型",
|
|
1194
|
+
pickerUnavailable: "模型选择器不可用——请重新加载设置页后重试。",
|
|
1195
|
+
groupIntent: "意图分类",
|
|
1196
|
+
groupTodo: "自动续推",
|
|
1197
|
+
groupGuard: "上下文压力",
|
|
1198
|
+
groupEditing: "文件编辑",
|
|
1199
|
+
groupWorktree: "Worktree 车道",
|
|
1200
|
+
groupRobash: "只读命令行",
|
|
1201
|
+
groupLsp: "LSP 语义工具",
|
|
1202
|
+
groupNotify: "系统通知",
|
|
1203
|
+
groupRoutingCategories: "任务类别",
|
|
1204
|
+
groupRoutingAgents: "精选代理",
|
|
1205
|
+
groupRoutingSupervision: "监督与重试",
|
|
1206
|
+
intentGateClassifierOptionRegex: "regex(规则)",
|
|
1207
|
+
intentGateClassifierOptionLlm: "llm(语义)",
|
|
1208
|
+
intentGateClassifierOptionJev: "jev(实验)",
|
|
1209
|
+
intentGateClassifier: "意图分类器",
|
|
1210
|
+
intentGateClassifierHint: "如何识别每条消息的意图:regex 用内置规则,零成本(默认);llm 用独立小模型做语义分类;jev 为实验实现。",
|
|
1211
|
+
intentGateProvider: "分类器模型(llm 模式)",
|
|
1212
|
+
intentGateProviderHint: "为语义分类单独指定的模型;留空跟随会话当前模型。",
|
|
1213
|
+
intentGateModel: "分类器模型名(llm 模式)",
|
|
1214
|
+
intentGateModelHint: "留空跟随会话路由所用模型。",
|
|
1215
|
+
intentGateReasoningEffort: "分类器推理档位(llm 模式)",
|
|
1216
|
+
intentGateReasoningEffortHint: "留空跟随模型默认。",
|
|
1217
|
+
intentGateTimeoutMs: "分类超时(毫秒)",
|
|
1218
|
+
intentGateTimeoutMsHint: "超过该时长按规则分类结果继续,不阻塞消息(默认 1500)。",
|
|
1219
|
+
jevEndpoint: "Jev 端点",
|
|
1220
|
+
jevEndpointHint: "Jev 决策服务地址(实验模式)。",
|
|
1221
|
+
jevModel: "Jev 模型",
|
|
1222
|
+
jevModelHint: "Jev 使用的模型名(默认 jev)。",
|
|
1223
|
+
jevApiKeyEnv: "Jev 密钥环境变量名",
|
|
1224
|
+
jevApiKeyEnvHint: "存放 Jev API 密钥的环境变量名;密钥本身不写入配置。",
|
|
1225
|
+
delegateCategoryChains: "任务类别模型",
|
|
1226
|
+
delegateCategoryChainsHint: "每类任务委派给子代理时使用的模型;可添加备选按序回退,留空跟随会话模型。",
|
|
1227
|
+
delegateAgentChains: "精选代理模型",
|
|
1228
|
+
delegateAgentChainsHint: "finder、scholar、advisor 各自运行的模型;留空继承调用方路由。",
|
|
1229
|
+
delegateDisabledCategories: "停用任务类别",
|
|
1230
|
+
delegateDisabledCategoriesHint: "停用的类别从委派清单中移除,助手无法再委派这类任务。",
|
|
1231
|
+
supervisionMaxRetries: "子代理续推上限",
|
|
1232
|
+
supervisionMaxRetriesHint: "受监督子代理未交结果或连续出错时,最多自动续推几次(默认 5)。",
|
|
1233
|
+
supervisionInitialBackoffMs: "重试初始间隔(毫秒)",
|
|
1234
|
+
supervisionInitialBackoffMsHint: "首次重试前的等待时间,之后逐次加倍(默认 30000)。",
|
|
1235
|
+
supervisionMaxBackoffMs: "重试间隔上限(毫秒)",
|
|
1236
|
+
supervisionMaxBackoffMsHint: "重试间隔最多增长到该值(默认 300000)。",
|
|
1237
|
+
todoEnabled: "自动续推",
|
|
1238
|
+
todoEnabledHint: "有待办未完成时,助手自动继续推进,无需你发消息(默认开启)。",
|
|
1239
|
+
todoMaxConsecutive: "连续续推上限",
|
|
1240
|
+
todoMaxConsecutiveHint: "没有你输入时最多连续自动续推几轮(默认 8)。",
|
|
1241
|
+
todoErrorRetryMax: "出错重试上限",
|
|
1242
|
+
todoErrorRetryMaxHint: "模型供应商报错时最多自动重试几次(默认 5)。",
|
|
1243
|
+
guardEnabled: "上下文压力守卫",
|
|
1244
|
+
guardEnabledHint: "上下文将满时提醒助手收尾并请求压缩,避免超限报错;即时生效。",
|
|
1245
|
+
guardSoftThreshold: "提醒阈值",
|
|
1246
|
+
guardSoftThresholdHint: "上下文用量超过该比例时提醒助手收尾(默认 0.72,须小于压缩阈值)。",
|
|
1247
|
+
guardHardThreshold: "压缩阈值",
|
|
1248
|
+
guardHardThresholdHint: "上下文用量超过该比例时请求立即压缩(默认 0.88,不保证压缩完成)。",
|
|
1249
|
+
hashlineHideStockEdit: "仅用锚点编辑",
|
|
1250
|
+
hashlineHideStockEditHint: "隐藏内置 edit 工具,文件修改一律走 hash_edit 锚点编辑。",
|
|
1251
|
+
editLockEnabled: "编辑锁",
|
|
1252
|
+
editLockEnabledHint: "多个会话轮流编辑同一批文件,而不是互相覆盖。",
|
|
1253
|
+
editLockOptOutWarning: "编辑锁已设为关闭。保存后须重启 DeepSeek Harness 才会生效。停用强制执行后,普通编辑不受保护,可能覆盖其他会话的工作。旧围栏与历史仍会保留,重新启用编辑锁时可能再次阻塞文件。",
|
|
1254
|
+
editLockAutoResume: "发消息即恢复编辑",
|
|
1255
|
+
editLockAutoResumeHint: "会话被停止后,发送任意消息即自动恢复其编辑权并确认保留的文件(默认开启)。",
|
|
1256
|
+
editLockStaleSweep: "自动清理失效锁",
|
|
1257
|
+
editLockStaleSweepHint: "目标文件已被删除或移动的锁,在你发消息时自动复核并释放(默认开启)。",
|
|
1258
|
+
worktreeEnabled: "Worktree 车道",
|
|
1259
|
+
worktreeEnabledHint: "让助手在隔离的 git worktree 中工作:车道工具、/worktree 命令与车道面板。",
|
|
1260
|
+
worktreeAutoSetup: "新车道自动安装依赖",
|
|
1261
|
+
worktreeAutoSetupHint: "开车道时自动执行仓库配置的安装命令(默认开启)。",
|
|
1262
|
+
worktreeMaxActive: "活跃车道上限",
|
|
1263
|
+
worktreeMaxActiveHint: "每个仓库最多同时活跃几条车道(默认 4)。",
|
|
1264
|
+
worktreeRoot: "车道目录",
|
|
1265
|
+
worktreeRootHint: "车道存放在仓库内的相对目录(默认 .weir/worktrees,已通过 .git/info/exclude 本地忽略)。",
|
|
1266
|
+
worktreeWatchTimeoutMinutes: "车道订阅有效期(分钟)",
|
|
1267
|
+
worktreeWatchTimeoutMinutesHint: "订阅车道状态后,超过该时长未命中即过期并通知一次(默认 360);已建立的订阅不变。",
|
|
1268
|
+
worktreeAutoApprove: "车道自动授权",
|
|
1269
|
+
worktreeAutoApproveHint: "新会话的默认审批方式:manual 每次都问;auto-keep 自动批准并保留分支;auto-clean 自动批准并删除分支;会话内 /worktree approve 可覆盖。",
|
|
1270
|
+
worktreeAutoApproveOptionManual: "manual(手动)",
|
|
1271
|
+
"worktreeAutoApproveOptionAuto-keep": "auto-keep(保留分支)",
|
|
1272
|
+
"worktreeAutoApproveOptionAuto-clean": "auto-clean(清理分支)",
|
|
1273
|
+
robashEnabled: "只读命令行守卫",
|
|
1274
|
+
robashEnabledHint: "精选只读代理(finder 等)只能运行允许清单内的只读命令(默认开启)。",
|
|
1275
|
+
robashAllow: "额外允许的命令",
|
|
1276
|
+
robashAllowHint: "在内置允许清单之上追加的命令名;内置清单始终生效,留空即不追加。",
|
|
1277
|
+
robashGitAllow: "额外允许的 git 子命令",
|
|
1278
|
+
robashGitAllowHint: "追加的 git 只读子命令(与 pwsh 侧共用);留空即不追加。",
|
|
1279
|
+
robashDeny: "额外禁止的命令",
|
|
1280
|
+
robashDenyHint: "在内置禁止清单之上追加的命令名;禁止优先于允许。",
|
|
1281
|
+
robashPwshAllow: "额外允许的 pwsh 命令",
|
|
1282
|
+
robashPwshAllowHint: "Windows 只读 pwsh 的追加允许项;内置清单始终生效。",
|
|
1283
|
+
robashPwshDeny: "额外禁止的 pwsh 命令",
|
|
1284
|
+
robashPwshDenyHint: "Windows 只读 pwsh 的追加禁止项;禁止优先于允许。",
|
|
1285
|
+
lspEnabled: "LSP 语义工具",
|
|
1286
|
+
lspEnabledHint: "开启后,每个会话可在输入栏单独启用定义跳转、引用查找等语言服务(会话默认关)。",
|
|
1287
|
+
lspServers: "自定义语言服务器",
|
|
1288
|
+
lspServersHint: "添加内置清单之外的语言服务器,在管理面板中可视化配置。",
|
|
1289
|
+
notifyEnabled: "系统通知",
|
|
1290
|
+
notifyEnabledHint: "会话需要你处理或一轮任务结束时发送系统通知(默认开启)。",
|
|
1291
|
+
notifyOnComplete: "完成时通知",
|
|
1292
|
+
notifyOnCompleteHint: "一轮任务结束且耗时超过下方最短时长时通知。",
|
|
1293
|
+
notifyOnAttention: "需要处理时通知",
|
|
1294
|
+
notifyOnAttentionHint: "审批请求、提问、计划评审、任务失败或中止时通知。",
|
|
1295
|
+
notifyMinTurnSeconds: "最短通知时长(秒)",
|
|
1296
|
+
notifyMinTurnSecondsHint: "任务至少运行这么久才通知完成;0 表示每轮都通知(默认 15)。",
|
|
1297
|
+
notifySound: "通知提示音",
|
|
1298
|
+
notifySoundHint: "通知时播放系统提示音(平台支持时)。",
|
|
1299
|
+
notifyForeground: "窗口在前台时",
|
|
1300
|
+
notifyForegroundHint: "你正看着窗口时是否仍通知:不通知(默认)或始终通知。",
|
|
1301
|
+
notifyForegroundOptionSkip: "不通知",
|
|
1302
|
+
notifyForegroundOptionAlways: "始终通知",
|
|
1303
|
+
},
|
|
1304
|
+
};
|
|
1305
|
+
|
|
1306
|
+
exports.dictionaries = dictionaries;
|
|
1037
1307
|
exports.GROUPS = GROUPS;
|
|
1038
1308
|
exports.BOOLEAN_DEFAULTS = BOOLEAN_DEFAULTS;
|
|
1039
1309
|
exports.FIELD_DEFAULTS = FIELD_DEFAULTS;
|
|
@@ -254,6 +254,231 @@ window.__ModuleLoader__.load({
|
|
|
254
254
|
if (typeof setup === "string" && setup.trim() !== "") payload.setup = setup.trim();
|
|
255
255
|
return JSON.stringify(payload);
|
|
256
256
|
}
|
|
257
|
+
// Locale data face (pure data, NO ctx calls — a chunk factory re-executes
|
|
258
|
+
// under HMR, so a chunk-local register would throw on the duplicate
|
|
259
|
+
// (namespace, locale) pair): the entry registers these under
|
|
260
|
+
// "settings.weir.worktree" inside a ctx.effect when this chunk arrives
|
|
261
|
+
// (lib/client.js registerChunkDictionaries). Keys stay "worktree"-prefixed:
|
|
262
|
+
// the views name them unprefixed and the entry’s worktreeT seat re-prefixes.
|
|
263
|
+
// Only the apply-time strings the entry’s synchronous surfaces read stay
|
|
264
|
+
// entry-side (tab title/guide thunks and the panel’s pre-arrival
|
|
265
|
+
// worktreeLoading — byte-identical in both homes, a documented
|
|
266
|
+
// cross-namespace duplicate). Pinned by test/client-worktree-labels.test.js
|
|
267
|
+
// and test/client.test.js’s dictionary union pin.
|
|
268
|
+
const dictionaries = {
|
|
269
|
+
en: {
|
|
270
|
+
worktreePillMode: "Worktree",
|
|
271
|
+
worktreePillLanes: "Worktree",
|
|
272
|
+
worktreePillCount: "{n} lane(s)",
|
|
273
|
+
worktreePillAwaiting: "{n} awaiting approval",
|
|
274
|
+
worktreePillTitle: "Worktree lanes — open the panel",
|
|
275
|
+
worktreePillBaseMoved: "The main worktree left the lane base branch; check it out to land",
|
|
276
|
+
worktreeModeLabel: "Worktree",
|
|
277
|
+
worktreeModeTitle: "Optional discipline: lanes work without this mode. Turned on, the assistant stops editing files directly and every change goes through isolated lanes.",
|
|
278
|
+
worktreeModeUnavailable: "Worktree mode unavailable:",
|
|
279
|
+
worktreeApproveLabel: "Auto-approve",
|
|
280
|
+
worktreeApproveTitle: "Lane auto-approve mode ({mode}): manual asks on every card; auto-keep merges/abandons without cards and removes the worktree but keeps the branch; auto-clean also deletes the branch. The new-session default lives in Settings › Worktree.",
|
|
281
|
+
worktreeApproveOptionManual: "manual",
|
|
282
|
+
worktreeApproveOptionAutoKeep: "keep",
|
|
283
|
+
worktreeApproveOptionAutoClean: "clean",
|
|
284
|
+
worktreeLoading: "Loading lanes…",
|
|
285
|
+
worktreeLoadFailed: "The lane view could not be read.",
|
|
286
|
+
worktreeUnavailable: "Worktree lanes are unavailable for this session.",
|
|
287
|
+
worktreeDisabled: "Worktree lanes are switched off in Settings.",
|
|
288
|
+
worktreeEmpty: "No active lanes. The assistant opens one with worktree_open.",
|
|
289
|
+
worktreeEmptyTitle: "No active lanes",
|
|
290
|
+
worktreeEmptyBody: "When the assistant needs an isolated workspace it opens one with worktree_open. Track checks, approve merges, and clean up here.",
|
|
291
|
+
worktreeRefresh: "Refresh",
|
|
292
|
+
worktreeConfigure: "Verification…",
|
|
293
|
+
worktreeShowHistory: "History ({n})",
|
|
294
|
+
worktreeHideHistory: "Hide history",
|
|
295
|
+
worktreeVerificationOn: "verification: {n} command(s)",
|
|
296
|
+
worktreeVerificationOff: "verification not enabled",
|
|
297
|
+
worktreeExcludeOk: "locally ignored",
|
|
298
|
+
worktreeExcludeMissing: "lane folder is not ignored yet",
|
|
299
|
+
worktreeUnmanaged: "{n} worktree(s) under the lane folder are not managed by Weir",
|
|
300
|
+
worktreeStaleData: "Showing the last data read; the refresh failed.",
|
|
301
|
+
worktreeAheadBehind: "{ahead} ahead · {behind} behind",
|
|
302
|
+
worktreeBaseMoved: "base moved",
|
|
303
|
+
worktreeNextLabel: "next: {next}",
|
|
304
|
+
worktreeViewDiff: "Changes",
|
|
305
|
+
worktreeHideDiff: "Hide changes",
|
|
306
|
+
worktreeDiffUnavailable: "changes unavailable",
|
|
307
|
+
worktreeFiles: "{n} file(s)",
|
|
308
|
+
worktreeExitCode: "exit {code}",
|
|
309
|
+
worktreeNoChanges: "No changes against the base branch.",
|
|
310
|
+
worktreeRecheck: "Re-check",
|
|
311
|
+
worktreeRetrySetup: "Retry setup",
|
|
312
|
+
worktreeSkipSetup: "Skip setup",
|
|
313
|
+
worktreeLand: "Merge…",
|
|
314
|
+
worktreeLandConfirm: "Confirm merge",
|
|
315
|
+
worktreeAbandon: "Abandon…",
|
|
316
|
+
worktreeAbandonConfirm: "Confirm abandon",
|
|
317
|
+
worktreeCleanupWorktree: "Remove worktree",
|
|
318
|
+
worktreeCleanupAll: "Remove worktree and branch",
|
|
319
|
+
worktreeCleanupAllConfirm: "Confirm remove branch",
|
|
320
|
+
worktreeCopyPath: "Copy path",
|
|
321
|
+
worktreeActionUnavailable: "not available now",
|
|
322
|
+
worktreeActionFailed: "This lane action is unavailable right now; try the /worktree command directly.",
|
|
323
|
+
worktreeConflicts: "conflicts",
|
|
324
|
+
worktreeMergeCommit: "merge commit",
|
|
325
|
+
worktreeCleanup: "cleanup",
|
|
326
|
+
worktreeConfigName: "name",
|
|
327
|
+
worktreeConfigRun: "command",
|
|
328
|
+
worktreeConfigChecks: "Verification commands",
|
|
329
|
+
worktreeConfigSetup: "setup command (optional)",
|
|
330
|
+
worktreeConfigAdd: "Add command",
|
|
331
|
+
worktreeConfigRemove: "Remove",
|
|
332
|
+
worktreeConfigSave: "Save",
|
|
333
|
+
worktreeCancel: "Cancel",
|
|
334
|
+
worktreeConfigHint: "Saved to this repository only (.weir/worktrees/.config.json, never committed). Commands run in a lane when it is checked.",
|
|
335
|
+
worktreeInitParseFailed: "The repository configuration could not be read.",
|
|
336
|
+
worktreeFlatInput: "Input",
|
|
337
|
+
worktreeFlatOutput: "Output",
|
|
338
|
+
worktreeState_preparing: "preparing",
|
|
339
|
+
worktreeState_setup_failed: "setup failed",
|
|
340
|
+
worktreeState_ready: "ready",
|
|
341
|
+
worktreeState_working: "working",
|
|
342
|
+
worktreeState_dirty: "uncommitted changes",
|
|
343
|
+
worktreeState_no_commits: "no commits",
|
|
344
|
+
worktreeState_branch_moved: "branch moved",
|
|
345
|
+
worktreeState_checking: "checking",
|
|
346
|
+
worktreeState_check_failed: "check failed",
|
|
347
|
+
worktreeState_landable: "ready to merge",
|
|
348
|
+
worktreeState_conflicted: "conflicts",
|
|
349
|
+
worktreeState_awaiting_approval: "awaiting approval",
|
|
350
|
+
worktreeState_declined: "merge declined",
|
|
351
|
+
worktreeState_landed: "merged",
|
|
352
|
+
worktreeState_kept: "kept",
|
|
353
|
+
worktreeState_cleaned: "cleaned up",
|
|
354
|
+
worktreeState_abandoned: "abandoned",
|
|
355
|
+
worktreeTool_worktree_open: "Open worktree lane",
|
|
356
|
+
worktreeTool_worktree_check: "Check worktree lane",
|
|
357
|
+
worktreeTool_worktree_land: "Merge worktree lane",
|
|
358
|
+
worktreeTool_worktree_cleanup: "Worktree cleanup",
|
|
359
|
+
worktreeTool_worktree_abandon: "Abandon worktree lane",
|
|
360
|
+
worktreeTool_worktree_watch: "Watch worktree lane",
|
|
361
|
+
worktreeWatchStates: "Watching for",
|
|
362
|
+
worktreeWatchExpires: "until {time}",
|
|
363
|
+
worktreeWatchHit: "hit immediately",
|
|
364
|
+
worktreeWatching: "{n} watching",
|
|
365
|
+
worktreeNext_delegate: "assign a worker to this lane",
|
|
366
|
+
worktreeNext_worktree_check: "check the lane",
|
|
367
|
+
worktreeNext_worktree_land: "merge the lane (asks you to approve)",
|
|
368
|
+
worktreeNext_worktree_cleanup: "choose the cleanup",
|
|
369
|
+
worktreeWait_lane_ready: "waiting for dependency setup",
|
|
370
|
+
worktreeWait_child_settle: "waiting for the lane worker",
|
|
371
|
+
worktreeWait_check_complete: "waiting for verification",
|
|
372
|
+
worktreeWait_user: "waiting for your decision",
|
|
373
|
+
},
|
|
374
|
+
zh: {
|
|
375
|
+
worktreePillMode: "Worktree",
|
|
376
|
+
worktreePillLanes: "Worktree",
|
|
377
|
+
worktreePillCount: "{n} 条车道",
|
|
378
|
+
worktreePillAwaiting: "{n} 待批准",
|
|
379
|
+
worktreePillTitle: "Worktree 车道——打开面板",
|
|
380
|
+
worktreePillBaseMoved: "主工作区已离开车道基线分支,切回后才能合并",
|
|
381
|
+
worktreeModeLabel: "Worktree",
|
|
382
|
+
worktreeModeTitle: "可选纪律:车道随时可用,无需开启。开启后助手不再直接改文件,所有改动走隔离车道。",
|
|
383
|
+
worktreeModeUnavailable: "Worktree 模式不可用:",
|
|
384
|
+
worktreeApproveLabel: "自动授权",
|
|
385
|
+
worktreeApproveTitle: "车道自动授权模式({mode}):manual 每张卡片都要批准;auto-keep 自动批准合并/放弃并清理 worktree 但保留分支;auto-clean 连分支一起删除。新会话默认在设置 › Worktree 车道。",
|
|
386
|
+
worktreeApproveOptionManual: "手动",
|
|
387
|
+
worktreeApproveOptionAutoKeep: "保留",
|
|
388
|
+
worktreeApproveOptionAutoClean: "清理",
|
|
389
|
+
worktreeLoading: "正在加载车道…",
|
|
390
|
+
worktreeLoadFailed: "车道视图读取失败。",
|
|
391
|
+
worktreeUnavailable: "本会话无法使用 Worktree 车道。",
|
|
392
|
+
worktreeDisabled: "Worktree 车道已在设置中关闭。",
|
|
393
|
+
worktreeEmpty: "没有活跃车道。助手会用 worktree_open 开一条。",
|
|
394
|
+
worktreeEmptyTitle: "没有活跃车道",
|
|
395
|
+
worktreeEmptyBody: "助手需要隔离工作区时会用 worktree_open 开一条车道。在这里跟踪检查、批准合并与收尾。",
|
|
396
|
+
worktreeRefresh: "刷新",
|
|
397
|
+
worktreeConfigure: "验证配置…",
|
|
398
|
+
worktreeShowHistory: "历史({n})",
|
|
399
|
+
worktreeHideHistory: "收起历史",
|
|
400
|
+
worktreeVerificationOn: "验证:{n} 条命令",
|
|
401
|
+
worktreeVerificationOff: "未启用验证",
|
|
402
|
+
worktreeExcludeOk: "已本地忽略",
|
|
403
|
+
worktreeExcludeMissing: "车道目录尚未忽略",
|
|
404
|
+
worktreeUnmanaged: "车道目录下有 {n} 个不由 Weir 管理的 worktree",
|
|
405
|
+
worktreeStaleData: "显示的是上次读取的数据;刷新失败。",
|
|
406
|
+
worktreeAheadBehind: "领先 {ahead} · 落后 {behind}",
|
|
407
|
+
worktreeBaseMoved: "基线已移动",
|
|
408
|
+
worktreeNextLabel: "下一步:{next}",
|
|
409
|
+
worktreeViewDiff: "改动",
|
|
410
|
+
worktreeHideDiff: "收起改动",
|
|
411
|
+
worktreeDiffUnavailable: "改动不可用",
|
|
412
|
+
worktreeFiles: "{n} 个文件",
|
|
413
|
+
worktreeExitCode: "退出码 {code}",
|
|
414
|
+
worktreeNoChanges: "相对基线分支没有改动。",
|
|
415
|
+
worktreeRecheck: "重新检查",
|
|
416
|
+
worktreeRetrySetup: "重试安装",
|
|
417
|
+
worktreeSkipSetup: "跳过安装",
|
|
418
|
+
worktreeLand: "合并…",
|
|
419
|
+
worktreeLandConfirm: "确认合并",
|
|
420
|
+
worktreeAbandon: "放弃…",
|
|
421
|
+
worktreeAbandonConfirm: "确认放弃",
|
|
422
|
+
worktreeCleanupWorktree: "清理 worktree",
|
|
423
|
+
worktreeCleanupAll: "清理 worktree 与分支",
|
|
424
|
+
worktreeCleanupAllConfirm: "确认删除分支",
|
|
425
|
+
worktreeCopyPath: "复制路径",
|
|
426
|
+
worktreeActionUnavailable: "当前不可用",
|
|
427
|
+
worktreeActionFailed: "此车道操作当前不可用,请改用 /worktree 命令直接执行。",
|
|
428
|
+
worktreeConflicts: "冲突",
|
|
429
|
+
worktreeMergeCommit: "合并提交",
|
|
430
|
+
worktreeCleanup: "收尾",
|
|
431
|
+
worktreeConfigName: "名称",
|
|
432
|
+
worktreeConfigRun: "命令",
|
|
433
|
+
worktreeConfigChecks: "验证命令",
|
|
434
|
+
worktreeConfigSetup: "setup 命令(可选)",
|
|
435
|
+
worktreeConfigAdd: "添加命令",
|
|
436
|
+
worktreeConfigRemove: "删除",
|
|
437
|
+
worktreeConfigSave: "保存",
|
|
438
|
+
worktreeCancel: "取消",
|
|
439
|
+
worktreeConfigHint: "只写入本仓库(.weir/worktrees/.config.json,不入库)。车道检查时在该车道内执行这些命令。",
|
|
440
|
+
worktreeInitParseFailed: "仓库配置读取失败。",
|
|
441
|
+
worktreeFlatInput: "输入",
|
|
442
|
+
worktreeFlatOutput: "输出",
|
|
443
|
+
worktreeState_preparing: "准备中",
|
|
444
|
+
worktreeState_setup_failed: "安装失败",
|
|
445
|
+
worktreeState_ready: "就绪",
|
|
446
|
+
worktreeState_working: "工作中",
|
|
447
|
+
worktreeState_dirty: "有未提交改动",
|
|
448
|
+
worktreeState_no_commits: "没有提交",
|
|
449
|
+
worktreeState_branch_moved: "分支被切换",
|
|
450
|
+
worktreeState_checking: "检查中",
|
|
451
|
+
worktreeState_check_failed: "检查失败",
|
|
452
|
+
worktreeState_landable: "可合并",
|
|
453
|
+
worktreeState_conflicted: "有冲突",
|
|
454
|
+
worktreeState_awaiting_approval: "等待批准",
|
|
455
|
+
worktreeState_declined: "已拒绝合并",
|
|
456
|
+
worktreeState_landed: "已合并",
|
|
457
|
+
worktreeState_kept: "已保留",
|
|
458
|
+
worktreeState_cleaned: "已清理",
|
|
459
|
+
worktreeState_abandoned: "已放弃",
|
|
460
|
+
worktreeTool_worktree_open: "开启 worktree 车道",
|
|
461
|
+
worktreeTool_worktree_check: "检查 worktree 车道",
|
|
462
|
+
worktreeTool_worktree_land: "合并 worktree 车道",
|
|
463
|
+
worktreeTool_worktree_cleanup: "worktree 收尾",
|
|
464
|
+
worktreeTool_worktree_abandon: "放弃 worktree 车道",
|
|
465
|
+
worktreeTool_worktree_watch: "订阅 worktree 车道",
|
|
466
|
+
worktreeWatchStates: "订阅状态",
|
|
467
|
+
worktreeWatchExpires: "有效期至 {time}",
|
|
468
|
+
worktreeWatchHit: "已立即命中",
|
|
469
|
+
worktreeWatching: "{n} 个订阅",
|
|
470
|
+
worktreeNext_delegate: "派子代理到该车道工作",
|
|
471
|
+
worktreeNext_worktree_check: "检查车道",
|
|
472
|
+
worktreeNext_worktree_land: "合并车道(需你批准)",
|
|
473
|
+
worktreeNext_worktree_cleanup: "选择收尾方式",
|
|
474
|
+
worktreeWait_lane_ready: "等待依赖安装完成",
|
|
475
|
+
worktreeWait_child_settle: "等待车道子代理完成",
|
|
476
|
+
worktreeWait_check_complete: "等待验证完成",
|
|
477
|
+
worktreeWait_user: "等待你的决定",
|
|
478
|
+
},
|
|
479
|
+
};
|
|
480
|
+
|
|
481
|
+
exports.dictionaries = dictionaries;
|
|
257
482
|
exports.WORKTREE_PROJECTION_KEY = WORKTREE_PROJECTION_KEY;
|
|
258
483
|
exports.WORKTREE_TOOLS = TOOLS;
|
|
259
484
|
exports.FINISHED = FINISHED;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "weir-harness",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.2",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Weir \u2014 orchestrator-centric DSH agent preset: intent gate, category delegation, todo driver, pull-based background jobs, auto-compaction, hashline edit.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -28,8 +28,11 @@
|
|
|
28
28
|
"whitelist-defaults.json",
|
|
29
29
|
"icon.svg"
|
|
30
30
|
],
|
|
31
|
+
"engines": {
|
|
32
|
+
"dsh": ">=0.2.1-rc.1 <0.3.0"
|
|
33
|
+
},
|
|
31
34
|
"peerDependencies": {
|
|
32
|
-
"@deepseek-ai/dsh": ">=0.2.
|
|
35
|
+
"@deepseek-ai/dsh": ">=0.2.1-rc.1 <0.3.0"
|
|
33
36
|
},
|
|
34
37
|
"exports": {
|
|
35
38
|
"./package.json": "./package.json",
|
|
@@ -4,6 +4,14 @@
|
|
|
4
4
|
import { createBlackboardKernel } from './kernel.js'
|
|
5
5
|
import { createBlackboardStorage, sessionId } from './storage.js'
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* @param {object} dependencies
|
|
9
|
+
* @param {any} [dependencies.storage] durable store (createBlackboardStorage)
|
|
10
|
+
* @param {() => number} [dependencies.now]
|
|
11
|
+
* @param {(fn: () => void, ms: number) => any} [dependencies.setTimer]
|
|
12
|
+
* @param {(handle: any) => void} [dependencies.clearTimer]
|
|
13
|
+
* @param {(error: unknown) => void} [dependencies.warn] diagnostics sink
|
|
14
|
+
*/
|
|
7
15
|
export function createDurableBlackboard({ storage, now = Date.now, setTimer = setTimeout, clearTimer = clearTimeout, warn = () => {} }) {
|
|
8
16
|
const states = new Map()
|
|
9
17
|
const listeners = new Set()
|
|
@@ -152,6 +160,10 @@ export function createRuntimeMount(ctx, runtime) {
|
|
|
152
160
|
}
|
|
153
161
|
}
|
|
154
162
|
|
|
163
|
+
/**
|
|
164
|
+
* @param {any} ctx @param {any} agent @param {any} runtime @param {{ active: boolean }} [mount]
|
|
165
|
+
* @returns {Promise<string>}
|
|
166
|
+
*/
|
|
155
167
|
export async function resolveDurableRoot(ctx, agent, runtime, mount = undefined) {
|
|
156
168
|
let id = sessionId(agent?.id)
|
|
157
169
|
const wasLive = ctx.get?.('agents')?.get?.(id) === agent
|
package/src/blackboard/index.js
CHANGED
|
@@ -44,7 +44,7 @@ const MAX_ANCESTORS = 8
|
|
|
44
44
|
* @returns {number} TTL in minutes
|
|
45
45
|
*/
|
|
46
46
|
export function resolveWriteTokenTtlMinutes(section) {
|
|
47
|
-
const value = section && typeof section === 'object' ? section.writeTokenTtlMinutes : undefined
|
|
47
|
+
const value = section && typeof section === 'object' ? /** @type {{ writeTokenTtlMinutes?: unknown }} */ (section).writeTokenTtlMinutes : undefined
|
|
48
48
|
if (value === undefined) return DEFAULT_WRITE_TOKEN_TTL_MINUTES
|
|
49
49
|
if (typeof value === 'number' && Number.isFinite(value) && value > 0) return value
|
|
50
50
|
throw new Error('weir-settings: blackboardWriteTokenTtlMinutes must be a positive number')
|
|
@@ -319,7 +319,7 @@ export function createBlackboardPlugin({ kernel, resolveTtl = resolveWriteTokenT
|
|
|
319
319
|
* rootOf pattern). A walk that breaks early degrades to the deepest known
|
|
320
320
|
* ancestor so boards never silently cross-contaminate conversations.
|
|
321
321
|
* @param {any} agent
|
|
322
|
-
* @returns {string | undefined}
|
|
322
|
+
* @returns {string | undefined | Promise<string | undefined>}
|
|
323
323
|
*/
|
|
324
324
|
const boardOf = agent => {
|
|
325
325
|
if (lifecycle) return lifecycle.run(agent, root => root)
|