@ran-sh/dsh-crew 1.0.0 → 1.0.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/README.md +24 -20
- package/README.zh.md +21 -18
- package/lib/client.js +156 -13
- package/official-web-bridge/lib/client.js +156 -13
- package/package.json +166 -166
- package/src/client/index.tsx +765 -716
- package/src/hub/index.mjs +420 -66
- package/src/install/install-legacy.mjs +184 -185
- package/src/policy-legacy.mjs +2 -2
- package/src/provider-delete-adapters.mjs +1786 -451
- package/src/provider-inventory.mjs +170 -132
- package/src/provider-lifecycle-state.mjs +100 -95
- package/src/provider-lifecycle.mjs +252 -214
- package/src/provider-profile-store.mjs +189 -171
- package/src/provider-settings-store.mjs +215 -0
- package/src/runtime-identity.mjs +72 -72
|
@@ -509,6 +509,8 @@ const COPY = {
|
|
|
509
509
|
providerState: (state) => `状态:${state}`,
|
|
510
510
|
providerModels: (count) => `${count} 个模型`,
|
|
511
511
|
providerJobs: (count) => `${count} 个运行任务`,
|
|
512
|
+
providerOfficialBuiltin: "· 官方内置(不可删除)",
|
|
513
|
+
providerSourceUnresolved: "· 来源未解析(安全锁定)",
|
|
512
514
|
providerDeletePlan: "生成删除计划",
|
|
513
515
|
providerDelete: "确认删除",
|
|
514
516
|
providerPlanReady: "计划已生成;再次确认后才会修改 3210 配置。",
|
|
@@ -519,6 +521,12 @@ const COPY = {
|
|
|
519
521
|
providerDeleteConfirm: "确认按计划删除这个 Harness Provider?会清理路由引用并重启 3210。",
|
|
520
522
|
providerDeleteBlocked: "当前 Provider 不能删除(内置、在用、已删除或缺少可用替换)。",
|
|
521
523
|
providerLifecycleError: "Provider 生命周期操作失败",
|
|
524
|
+
providerDeletePending: "配置可能已变更,事务仍待重启/验证;请刷新状态后选择回滚。",
|
|
525
|
+
providerRollbackContinue: "继续回滚验证",
|
|
526
|
+
recoveryUnresolved: "发现不可自动恢复的事务",
|
|
527
|
+
recoveryStorage: "存储项",
|
|
528
|
+
recoveryQuarantine: "隔离",
|
|
529
|
+
recoveryQuarantineConfirm: "该事务清单无法安全恢复。将其移入隔离区并阻止自动使用,继续?",
|
|
522
530
|
providerNoInventory: "暂时无法读取 3210 Provider inventory。",
|
|
523
531
|
credentialReferences: "Credential 引用",
|
|
524
532
|
credentialReferenceHint: "仅显示引用名、归属和孤儿状态;不会读取或删除密钥。",
|
|
@@ -832,6 +840,8 @@ const COPY = {
|
|
|
832
840
|
providerState: (state) => `State: ${state}`,
|
|
833
841
|
providerModels: (count) => `${count} models`,
|
|
834
842
|
providerJobs: (count) => `${count} running jobs`,
|
|
843
|
+
providerOfficialBuiltin: "· official built-in (immutable)",
|
|
844
|
+
providerSourceUnresolved: "· source unresolved (locked)",
|
|
835
845
|
providerDeletePlan: "Plan deletion",
|
|
836
846
|
providerDelete: "Confirm delete",
|
|
837
847
|
providerPlanReady: "Plan ready; a second confirmation is required before changing 3210 config.",
|
|
@@ -842,6 +852,12 @@ const COPY = {
|
|
|
842
852
|
providerDeleteConfirm: "Delete this Harness Provider per the plan? Routing refs will be scrubbed and 3210 restarted.",
|
|
843
853
|
providerDeleteBlocked: "This Provider cannot be deleted (built-in, in use, already absent, or missing a valid replacement).",
|
|
844
854
|
providerLifecycleError: "Provider lifecycle operation failed",
|
|
855
|
+
providerDeletePending: "Configuration may already be changed; the transaction still needs restart/verification. Refresh status and use rollback if needed.",
|
|
856
|
+
providerRollbackContinue: "Continue rollback verification",
|
|
857
|
+
recoveryUnresolved: "An unrecoverable recovery transaction is blocking deletion",
|
|
858
|
+
recoveryStorage: "storage entry",
|
|
859
|
+
recoveryQuarantine: "Quarantine",
|
|
860
|
+
recoveryQuarantineConfirm: "This recovery manifest cannot be safely reopened. Move it into the quarantine area and keep it out of automatic recovery?",
|
|
845
861
|
providerNoInventory: "3210 Provider inventory is temporarily unavailable.",
|
|
846
862
|
credentialReferences: "Credential references",
|
|
847
863
|
credentialReferenceHint: "Names, ownership, and orphan status only; values are never read or deleted.",
|
|
@@ -1959,13 +1975,13 @@ function WorkersPanel({ ctx }) {
|
|
|
1959
1975
|
applyPatch(patch);
|
|
1960
1976
|
};
|
|
1961
1977
|
const deleteHarnessProvider = async (record) => {
|
|
1962
|
-
if (!record || record.
|
|
1978
|
+
if (!record || record.delete_capability !== "supported" || record.desired_state === "absent" || Number(record.references?.active_jobs ?? 0) > 0) {
|
|
1963
1979
|
setNotice(copy.providerDeleteBlocked);
|
|
1964
1980
|
return;
|
|
1965
1981
|
}
|
|
1966
1982
|
let replacementDefault;
|
|
1967
1983
|
if (record.references?.harness_default === true) {
|
|
1968
|
-
const candidate = (providerInventory?.records ?? []).find((item) => item.id !== record.id && item.desired_state !== "absent" && item.
|
|
1984
|
+
const candidate = (providerInventory?.records ?? []).find((item) => item.id === "deepseek-official" && item.id !== record.id && item.desired_state !== "absent" && (item.models?.length ?? 0) > 0)?.id ?? (providerInventory?.records ?? []).find((item) => item.id !== record.id && item.desired_state !== "absent" && item.delete_capability !== "source-unresolved" && (item.models?.length ?? 0) > 0)?.id ?? "";
|
|
1969
1985
|
const entered = window.prompt(copy.providerReplacement, candidate);
|
|
1970
1986
|
if (!entered?.trim()) return;
|
|
1971
1987
|
replacementDefault = entered.trim();
|
|
@@ -2006,13 +2022,29 @@ function WorkersPanel({ ctx }) {
|
|
|
2006
2022
|
setNotice(copy.saved);
|
|
2007
2023
|
await refreshProviderInventory();
|
|
2008
2024
|
} catch (error) {
|
|
2009
|
-
|
|
2025
|
+
try {
|
|
2026
|
+
await refreshProviderInventory();
|
|
2027
|
+
} catch {}
|
|
2028
|
+
setNotice(`${String(error?.message ?? error)} · ${copy.providerDeletePending}`);
|
|
2010
2029
|
} finally {
|
|
2011
2030
|
setProviderLifecycleBusy(null);
|
|
2012
2031
|
}
|
|
2013
2032
|
};
|
|
2014
|
-
const rollbackHarnessProvider = async (record, transactionId) => {
|
|
2015
|
-
|
|
2033
|
+
const rollbackHarnessProvider = async (record, transactionId, transactionState = "VERIFIED") => {
|
|
2034
|
+
const continuing = ["ROLLBACK_PENDING", "ROLLBACK_RESTART_PENDING"].includes(transactionState);
|
|
2035
|
+
const recoverable = [
|
|
2036
|
+
"PLANNED",
|
|
2037
|
+
"TOMBSTONE_APPLYING",
|
|
2038
|
+
"TOMBSTONE_APPLIED",
|
|
2039
|
+
"REFERENCES_APPLYING",
|
|
2040
|
+
"REFERENCES_APPLIED",
|
|
2041
|
+
"DECLARATIONS_APPLYING",
|
|
2042
|
+
"DECLARATIONS_APPLIED",
|
|
2043
|
+
"DELETE_RESTART_PENDING",
|
|
2044
|
+
"ROLLBACK_APPLYING",
|
|
2045
|
+
"ROLLBACK_RESTORED"
|
|
2046
|
+
].includes(transactionState);
|
|
2047
|
+
if (!record || !transactionId || !continuing && !recoverable && record.desired_state !== "absent") {
|
|
2016
2048
|
setNotice(copy.providerRollbackUnavailable);
|
|
2017
2049
|
return;
|
|
2018
2050
|
}
|
|
@@ -2021,7 +2053,11 @@ function WorkersPanel({ ctx }) {
|
|
|
2021
2053
|
setNotice(copy.working);
|
|
2022
2054
|
try {
|
|
2023
2055
|
const encoded = encodeURIComponent(record.id);
|
|
2024
|
-
const result =
|
|
2056
|
+
const result = continuing ? {
|
|
2057
|
+
ok: true,
|
|
2058
|
+
restart_required: true,
|
|
2059
|
+
state: "ROLLBACK_PENDING"
|
|
2060
|
+
} : await post(`/providers/${encoded}/rollback`, {
|
|
2025
2061
|
transaction_id: transactionId,
|
|
2026
2062
|
confirm: true
|
|
2027
2063
|
});
|
|
@@ -2043,6 +2079,32 @@ function WorkersPanel({ ctx }) {
|
|
|
2043
2079
|
setNotice(copy.saved);
|
|
2044
2080
|
await refreshProviderInventory();
|
|
2045
2081
|
} catch (error) {
|
|
2082
|
+
try {
|
|
2083
|
+
await refreshProviderInventory();
|
|
2084
|
+
} catch {}
|
|
2085
|
+
setNotice(`${String(error?.message ?? error)} · ${copy.providerDeletePending}`);
|
|
2086
|
+
} finally {
|
|
2087
|
+
setProviderLifecycleBusy(null);
|
|
2088
|
+
}
|
|
2089
|
+
};
|
|
2090
|
+
const quarantineRecoveryTransaction = async (entry) => {
|
|
2091
|
+
const actionId = typeof entry?.action_id === "string" ? entry.action_id : "";
|
|
2092
|
+
if (!actionId || entry?.recoverable === true) return;
|
|
2093
|
+
if (!window.confirm(copy.recoveryQuarantineConfirm)) return;
|
|
2094
|
+
setProviderLifecycleBusy(`quarantine:${actionId}`);
|
|
2095
|
+
setNotice(copy.working);
|
|
2096
|
+
try {
|
|
2097
|
+
const result = await post("/providers/_recovery/quarantine", {
|
|
2098
|
+
action_id: actionId,
|
|
2099
|
+
confirm: true
|
|
2100
|
+
});
|
|
2101
|
+
if (!result.ok) throw new Error(result.code ?? result.error ?? copy.providerLifecycleError);
|
|
2102
|
+
setNotice(copy.saved);
|
|
2103
|
+
await refreshProviderInventory();
|
|
2104
|
+
} catch (error) {
|
|
2105
|
+
try {
|
|
2106
|
+
await refreshProviderInventory();
|
|
2107
|
+
} catch {}
|
|
2046
2108
|
setNotice(String(error?.message ?? error));
|
|
2047
2109
|
} finally {
|
|
2048
2110
|
setProviderLifecycleBusy(null);
|
|
@@ -3040,7 +3102,7 @@ function WorkersPanel({ ctx }) {
|
|
|
3040
3102
|
style: S.fieldLabel,
|
|
3041
3103
|
children: copy.workerProvider
|
|
3042
3104
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CustomSelect, {
|
|
3043
|
-
value: config.worker_provider_mode ?? "
|
|
3105
|
+
value: config.worker_provider_mode ?? "deepseek-official",
|
|
3044
3106
|
onChange: (v) => field("worker_provider_mode", v),
|
|
3045
3107
|
options: ["follow-dsh", "deepseek-official"].map((m) => ({
|
|
3046
3108
|
value: m,
|
|
@@ -3588,9 +3650,31 @@ function WorkersPanel({ ctx }) {
|
|
|
3588
3650
|
children: copy.providerNoInventory
|
|
3589
3651
|
}),
|
|
3590
3652
|
(providerInventory?.records ?? []).map((record) => {
|
|
3591
|
-
const
|
|
3653
|
+
const immutable = record.delete_capability === "immutable-builtin";
|
|
3654
|
+
const unresolved = record.delete_capability === "source-unresolved";
|
|
3655
|
+
const blocked = immutable || unresolved || record.desired_state === "absent" || Number(record.references?.active_jobs ?? 0) > 0;
|
|
3592
3656
|
const lifecycle = record.desired_state === "absent" ? "absent" : record.lifecycle?.enabled === false ? "disabled" : record.lifecycle?.catalogued ? "catalogued" : "configured";
|
|
3593
|
-
const
|
|
3657
|
+
const lifecycleTransactions = providerInventory?.lifecycle_transactions ?? [];
|
|
3658
|
+
const recoveryTransactions = (providerInventory?.recovery_transactions ?? []).map((entry) => ({
|
|
3659
|
+
...entry,
|
|
3660
|
+
state: entry.phase
|
|
3661
|
+
}));
|
|
3662
|
+
const rollbackTransaction = [...lifecycleTransactions, ...recoveryTransactions].filter((entry) => entry.provider_id === record.id && [
|
|
3663
|
+
"VERIFIED",
|
|
3664
|
+
"RESTART_PENDING",
|
|
3665
|
+
"ROLLBACK_PENDING",
|
|
3666
|
+
"PLANNED",
|
|
3667
|
+
"TOMBSTONE_APPLYING",
|
|
3668
|
+
"TOMBSTONE_APPLIED",
|
|
3669
|
+
"REFERENCES_APPLYING",
|
|
3670
|
+
"REFERENCES_APPLIED",
|
|
3671
|
+
"DECLARATIONS_APPLYING",
|
|
3672
|
+
"DECLARATIONS_APPLIED",
|
|
3673
|
+
"DELETE_RESTART_PENDING",
|
|
3674
|
+
"ROLLBACK_RESTART_PENDING",
|
|
3675
|
+
"ROLLBACK_RESTORED",
|
|
3676
|
+
"ROLLBACK_APPLYING"
|
|
3677
|
+
].includes(entry.state)).sort((a, b) => String(a.updated_at ?? "").localeCompare(String(b.updated_at ?? ""))).at(-1);
|
|
3594
3678
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
3595
3679
|
style: {
|
|
3596
3680
|
display: "flex",
|
|
@@ -3619,12 +3703,20 @@ function WorkersPanel({ ctx }) {
|
|
|
3619
3703
|
style: { opacity: .65 },
|
|
3620
3704
|
children: copy.providerModels(record.models?.length ?? 0)
|
|
3621
3705
|
}),
|
|
3706
|
+
immutable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
3707
|
+
style: { opacity: .65 },
|
|
3708
|
+
children: copy.providerOfficialBuiltin
|
|
3709
|
+
}),
|
|
3710
|
+
unresolved && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
3711
|
+
style: { color: "#c98735" },
|
|
3712
|
+
children: copy.providerSourceUnresolved
|
|
3713
|
+
}),
|
|
3622
3714
|
Number(record.references?.active_jobs ?? 0) > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
3623
3715
|
style: { color: "#c98735" },
|
|
3624
3716
|
children: copy.providerJobs(record.references.active_jobs)
|
|
3625
3717
|
}),
|
|
3626
3718
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { style: { flex: 1 } }),
|
|
3627
|
-
record.
|
|
3719
|
+
record.delete_capability === "supported" && record.desired_state !== "absent" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
3628
3720
|
type: "button",
|
|
3629
3721
|
style: {
|
|
3630
3722
|
...S.btn,
|
|
@@ -3636,7 +3728,20 @@ function WorkersPanel({ ctx }) {
|
|
|
3636
3728
|
},
|
|
3637
3729
|
children: providerLifecycleBusy === record.id ? copy.working : copy.providerDeletePlan
|
|
3638
3730
|
}),
|
|
3639
|
-
record.desired_state === "absent"
|
|
3731
|
+
(record.desired_state === "absent" || [
|
|
3732
|
+
"PLANNED",
|
|
3733
|
+
"TOMBSTONE_APPLYING",
|
|
3734
|
+
"TOMBSTONE_APPLIED",
|
|
3735
|
+
"REFERENCES_APPLYING",
|
|
3736
|
+
"REFERENCES_APPLIED",
|
|
3737
|
+
"DECLARATIONS_APPLYING",
|
|
3738
|
+
"DECLARATIONS_APPLIED",
|
|
3739
|
+
"DELETE_RESTART_PENDING",
|
|
3740
|
+
"ROLLBACK_PENDING",
|
|
3741
|
+
"ROLLBACK_RESTART_PENDING",
|
|
3742
|
+
"ROLLBACK_RESTORED",
|
|
3743
|
+
"ROLLBACK_APPLYING"
|
|
3744
|
+
].includes(rollbackTransaction?.state)) && rollbackTransaction && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
3640
3745
|
type: "button",
|
|
3641
3746
|
style: {
|
|
3642
3747
|
...S.btn,
|
|
@@ -3644,13 +3749,51 @@ function WorkersPanel({ ctx }) {
|
|
|
3644
3749
|
},
|
|
3645
3750
|
disabled: providerLifecycleBusy !== null,
|
|
3646
3751
|
onClick: () => {
|
|
3647
|
-
rollbackHarnessProvider(record, rollbackTransaction.transaction_id);
|
|
3752
|
+
rollbackHarnessProvider(record, rollbackTransaction.transaction_id, rollbackTransaction.state);
|
|
3648
3753
|
},
|
|
3649
|
-
children: providerLifecycleBusy === `rollback:${record.id}` ? copy.working : copy.providerRollback
|
|
3754
|
+
children: providerLifecycleBusy === `rollback:${record.id}` ? copy.working : rollbackTransaction.state === "ROLLBACK_PENDING" ? copy.providerRollbackContinue : copy.providerRollback
|
|
3650
3755
|
})
|
|
3651
3756
|
]
|
|
3652
3757
|
}, record.id);
|
|
3653
3758
|
}),
|
|
3759
|
+
(providerInventory?.recovery_transactions ?? []).filter((entry) => entry?.unresolved === true || !entry?.provider_id).map((entry) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
3760
|
+
style: {
|
|
3761
|
+
display: "flex",
|
|
3762
|
+
alignItems: "center",
|
|
3763
|
+
gap: 8,
|
|
3764
|
+
fontSize: 12,
|
|
3765
|
+
flexWrap: "wrap",
|
|
3766
|
+
color: "#c98735",
|
|
3767
|
+
marginTop: 6
|
|
3768
|
+
},
|
|
3769
|
+
children: [
|
|
3770
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
3771
|
+
style: { fontWeight: 600 },
|
|
3772
|
+
children: copy.recoveryUnresolved
|
|
3773
|
+
}),
|
|
3774
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
3775
|
+
style: S.mono,
|
|
3776
|
+
children: entry.storage_id ?? entry.transaction_id ?? "unknown"
|
|
3777
|
+
}),
|
|
3778
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
3779
|
+
style: { opacity: .7 },
|
|
3780
|
+
children: entry.phase
|
|
3781
|
+
}),
|
|
3782
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { style: { flex: 1 } }),
|
|
3783
|
+
entry.action_id && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
3784
|
+
type: "button",
|
|
3785
|
+
style: {
|
|
3786
|
+
...S.btn,
|
|
3787
|
+
padding: "2px 8px"
|
|
3788
|
+
},
|
|
3789
|
+
disabled: providerLifecycleBusy !== null,
|
|
3790
|
+
onClick: () => {
|
|
3791
|
+
quarantineRecoveryTransaction(entry);
|
|
3792
|
+
},
|
|
3793
|
+
children: providerLifecycleBusy === `quarantine:${entry.action_id}` ? copy.working : copy.recoveryQuarantine
|
|
3794
|
+
})
|
|
3795
|
+
]
|
|
3796
|
+
}, `recovery:${entry.storage_id ?? entry.transaction_id ?? "unknown"}`)),
|
|
3654
3797
|
(credentialRefs.length > 0 || credentialUnverified.length > 0) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
3655
3798
|
style: {
|
|
3656
3799
|
marginTop: 10,
|
package/package.json
CHANGED
|
@@ -1,166 +1,166 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@ran-sh/dsh-crew",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"type": "module",
|
|
5
|
-
"main": "./src/hub/entry.mjs",
|
|
6
|
-
"bin": {
|
|
7
|
-
"dsh-crew": "bin/dsh-crew.mjs"
|
|
8
|
-
},
|
|
9
|
-
"description": "DeepSeek Harness plugin: dispatch work to DSH agents from Claude Code / Codex, as native subagents with live progress",
|
|
10
|
-
"dsh": {
|
|
11
|
-
"bundle": {
|
|
12
|
-
"patch": "./cordis.patch.yml"
|
|
13
|
-
},
|
|
14
|
-
"client": {
|
|
15
|
-
"inject": [
|
|
16
|
-
"@deepseek-ai/dsh-client-runtime",
|
|
17
|
-
"@deepseek-ai/dsh-client-locale",
|
|
18
|
-
"@deepseek-ai/dsh-client-ui-slots",
|
|
19
|
-
"@deepseek-ai/dsh-client-ui-settings"
|
|
20
|
-
],
|
|
21
|
-
"platform": "web"
|
|
22
|
-
}
|
|
23
|
-
},
|
|
24
|
-
"scripts": {
|
|
25
|
-
"mcp": "node src/server.mjs",
|
|
26
|
-
"build:client": "tsdown src/client/entry.tsx --format cjs --platform browser --target es2022 --tsconfig tsconfig.client.json --deps.never-bundle react --deps.never-bundle react/jsx-runtime --deps.never-bundle react-dom --deps.never-bundle react-dom/client --out-dir .client-build --clean --logLevel warn && node scripts/build-client.mjs",
|
|
27
|
-
"verify:npm-install": "node scripts/verify-npm-install.mjs",
|
|
28
|
-
"verify:npm-install:official": "node scripts/verify-npm-install.mjs --with-official-dsh",
|
|
29
|
-
"verify:official-bridge": "node scripts/verify-official-bridge-e2e.mjs"
|
|
30
|
-
},
|
|
31
|
-
"dependencies": {
|
|
32
|
-
"@modelcontextprotocol/sdk": "^1.25.4",
|
|
33
|
-
"zod": "^3.24.0"
|
|
34
|
-
},
|
|
35
|
-
"exports": {
|
|
36
|
-
".": "./src/hub/entry.mjs",
|
|
37
|
-
"./client": "./lib/client.js",
|
|
38
|
-
"./package.json": "./package.json"
|
|
39
|
-
},
|
|
40
|
-
"peerDependencies": {
|
|
41
|
-
"@deepseek-ai/dsh-agent": "0.1.1-rc.2",
|
|
42
|
-
"@deepseek-ai/dsh-agent-presets": "0.1.1-rc.2",
|
|
43
|
-
"@deepseek-ai/dsh-agent-spine-demo": "0.1.1-rc.2",
|
|
44
|
-
"@deepseek-ai/dsh-bash-local": "0.1.1-rc.2",
|
|
45
|
-
"@deepseek-ai/dsh-compaction-basic": "0.1.1-rc.2",
|
|
46
|
-
"@deepseek-ai/dsh-fs-local": "0.1.1-rc.2",
|
|
47
|
-
"@deepseek-ai/dsh-fs-observation-policy": "0.1.1-rc.2",
|
|
48
|
-
"@deepseek-ai/dsh-llm": "0.1.1-rc.2",
|
|
49
|
-
"@deepseek-ai/dsh-llm-deepseek": "0.1.1-rc.2",
|
|
50
|
-
"@deepseek-ai/dsh-sandbox-local": "0.1.1-rc.2",
|
|
51
|
-
"@deepseek-ai/dsh-sandbox-policy": "0.1.1-rc.2",
|
|
52
|
-
"@deepseek-ai/dsh-sdk-client": "0.1.1-rc.2",
|
|
53
|
-
"@deepseek-ai/dsh-sdk-jsonrpc-demo": "0.1.1-rc.2",
|
|
54
|
-
"@deepseek-ai/dsh-sdk-jsonrpc-server": "0.1.1-rc.2",
|
|
55
|
-
"@deepseek-ai/dsh-session": "0.1.1-rc.2",
|
|
56
|
-
"@deepseek-ai/dsh-session-persistence-jsonl": "0.1.1-rc.2",
|
|
57
|
-
"@deepseek-ai/dsh-subprocess-local": "0.1.1-rc.2",
|
|
58
|
-
"@deepseek-ai/dsh-token-meter": "0.1.1-rc.2",
|
|
59
|
-
"@deepseek-ai/dsh-tool-fs": "0.1.1-rc.2",
|
|
60
|
-
"@deepseek-ai/dsh-tool-todo": "0.1.1-rc.2",
|
|
61
|
-
"react": "^18.0.0",
|
|
62
|
-
"react-dom": "^18.0.0"
|
|
63
|
-
},
|
|
64
|
-
"peerDependenciesMeta": {
|
|
65
|
-
"@deepseek-ai/dsh-agent": { "optional": true },
|
|
66
|
-
"@deepseek-ai/dsh-agent-presets": { "optional": true },
|
|
67
|
-
"@deepseek-ai/dsh-agent-spine-demo": { "optional": true },
|
|
68
|
-
"@deepseek-ai/dsh-bash-local": { "optional": true },
|
|
69
|
-
"@deepseek-ai/dsh-compaction-basic": { "optional": true },
|
|
70
|
-
"@deepseek-ai/dsh-fs-local": { "optional": true },
|
|
71
|
-
"@deepseek-ai/dsh-fs-observation-policy": { "optional": true },
|
|
72
|
-
"@deepseek-ai/dsh-llm": { "optional": true },
|
|
73
|
-
"@deepseek-ai/dsh-llm-deepseek": { "optional": true },
|
|
74
|
-
"@deepseek-ai/dsh-sandbox-local": { "optional": true },
|
|
75
|
-
"@deepseek-ai/dsh-sandbox-policy": { "optional": true },
|
|
76
|
-
"@deepseek-ai/dsh-sdk-client": { "optional": true },
|
|
77
|
-
"@deepseek-ai/dsh-sdk-jsonrpc-demo": { "optional": true },
|
|
78
|
-
"@deepseek-ai/dsh-sdk-jsonrpc-server": { "optional": true },
|
|
79
|
-
"@deepseek-ai/dsh-session": { "optional": true },
|
|
80
|
-
"@deepseek-ai/dsh-session-persistence-jsonl": { "optional": true },
|
|
81
|
-
"@deepseek-ai/dsh-subprocess-local": { "optional": true },
|
|
82
|
-
"@deepseek-ai/dsh-token-meter": { "optional": true },
|
|
83
|
-
"@deepseek-ai/dsh-tool-fs": { "optional": true },
|
|
84
|
-
"@deepseek-ai/dsh-tool-todo": { "optional": true },
|
|
85
|
-
"react": { "optional": true },
|
|
86
|
-
"react-dom": { "optional": true }
|
|
87
|
-
},
|
|
88
|
-
"devDependencies": {
|
|
89
|
-
"@deepseek-ai/dsh-agent": "0.1.1-rc.2",
|
|
90
|
-
"@deepseek-ai/dsh-agent-presets": "0.1.1-rc.2",
|
|
91
|
-
"@deepseek-ai/dsh-agent-spine-demo": "0.1.1-rc.2",
|
|
92
|
-
"@deepseek-ai/dsh-bash-local": "0.1.1-rc.2",
|
|
93
|
-
"@deepseek-ai/dsh-compaction-basic": "0.1.1-rc.2",
|
|
94
|
-
"@deepseek-ai/dsh-fs-local": "0.1.1-rc.2",
|
|
95
|
-
"@deepseek-ai/dsh-fs-observation-policy": "0.1.1-rc.2",
|
|
96
|
-
"@deepseek-ai/dsh-llm": "0.1.1-rc.2",
|
|
97
|
-
"@deepseek-ai/dsh-llm-deepseek": "0.1.1-rc.2",
|
|
98
|
-
"@deepseek-ai/dsh-sandbox-local": "0.1.1-rc.2",
|
|
99
|
-
"@deepseek-ai/dsh-sandbox-policy": "0.1.1-rc.2",
|
|
100
|
-
"@deepseek-ai/dsh-sdk-client": "0.1.1-rc.2",
|
|
101
|
-
"@deepseek-ai/dsh-sdk-jsonrpc-demo": "0.1.1-rc.2",
|
|
102
|
-
"@deepseek-ai/dsh-sdk-jsonrpc-server": "0.1.1-rc.2",
|
|
103
|
-
"@deepseek-ai/dsh-session": "0.1.1-rc.2",
|
|
104
|
-
"@deepseek-ai/dsh-session-persistence-jsonl": "0.1.1-rc.2",
|
|
105
|
-
"@deepseek-ai/dsh-subprocess-local": "0.1.1-rc.2",
|
|
106
|
-
"@deepseek-ai/dsh-token-meter": "0.1.1-rc.2",
|
|
107
|
-
"@deepseek-ai/dsh-tool-fs": "0.1.1-rc.2",
|
|
108
|
-
"@deepseek-ai/dsh-tool-todo": "0.1.1-rc.2",
|
|
109
|
-
"@types/react": "^18.3.0",
|
|
110
|
-
"react": "^18.3.1",
|
|
111
|
-
"react-dom": "^18.3.1",
|
|
112
|
-
"tsdown": "0.22.14",
|
|
113
|
-
"typescript": "^5.6.0"
|
|
114
|
-
},
|
|
115
|
-
"license": "MIT",
|
|
116
|
-
"repository": {
|
|
117
|
-
"type": "git",
|
|
118
|
-
"url": "git+https://github.com/Ran-sh/dsh-crew.git"
|
|
119
|
-
},
|
|
120
|
-
"homepage": "https://github.com/Ran-sh/dsh-crew",
|
|
121
|
-
"bugs": {
|
|
122
|
-
"url": "https://github.com/Ran-sh/dsh-crew/issues"
|
|
123
|
-
},
|
|
124
|
-
"keywords": [
|
|
125
|
-
"dsh",
|
|
126
|
-
"deepseek",
|
|
127
|
-
"claude-code",
|
|
128
|
-
"codex",
|
|
129
|
-
"zcode",
|
|
130
|
-
"windows",
|
|
131
|
-
"subagent",
|
|
132
|
-
"worker",
|
|
133
|
-
"multimodal",
|
|
134
|
-
"plugin",
|
|
135
|
-
"agent"
|
|
136
|
-
],
|
|
137
|
-
"files": [
|
|
138
|
-
"bin",
|
|
139
|
-
"lib",
|
|
140
|
-
"src",
|
|
141
|
-
"scripts",
|
|
142
|
-
"agents",
|
|
143
|
-
"commands",
|
|
144
|
-
"codex",
|
|
145
|
-
"zcode",
|
|
146
|
-
"statusline",
|
|
147
|
-
"official-web-bridge",
|
|
148
|
-
"windows",
|
|
149
|
-
"cordis.patch.yml",
|
|
150
|
-
"worker.cordis.yml",
|
|
151
|
-
".claude-plugin",
|
|
152
|
-
".mcp.json",
|
|
153
|
-
"README.md",
|
|
154
|
-
"README.*.md",
|
|
155
|
-
"docs/job-contracts.md",
|
|
156
|
-
"docs/readiness-matrix.md",
|
|
157
|
-
"docs/gpt-relay-extension.md",
|
|
158
|
-
"docs/ui-surfaces.md",
|
|
159
|
-
"docs/installation.md",
|
|
160
|
-
"docs/images/dsh-crew-logo.png",
|
|
161
|
-
"docs/images/dsh-crew-overview.png",
|
|
162
|
-
"docs/images/dsh-crew-host.png",
|
|
163
|
-
"docs/images/dsh-crew-jobs.png",
|
|
164
|
-
"LICENSE"
|
|
165
|
-
]
|
|
166
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@ran-sh/dsh-crew",
|
|
3
|
+
"version": "1.0.2",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./src/hub/entry.mjs",
|
|
6
|
+
"bin": {
|
|
7
|
+
"dsh-crew": "bin/dsh-crew.mjs"
|
|
8
|
+
},
|
|
9
|
+
"description": "DeepSeek Harness plugin: dispatch work to DSH agents from Claude Code / Codex, as native subagents with live progress",
|
|
10
|
+
"dsh": {
|
|
11
|
+
"bundle": {
|
|
12
|
+
"patch": "./cordis.patch.yml"
|
|
13
|
+
},
|
|
14
|
+
"client": {
|
|
15
|
+
"inject": [
|
|
16
|
+
"@deepseek-ai/dsh-client-runtime",
|
|
17
|
+
"@deepseek-ai/dsh-client-locale",
|
|
18
|
+
"@deepseek-ai/dsh-client-ui-slots",
|
|
19
|
+
"@deepseek-ai/dsh-client-ui-settings"
|
|
20
|
+
],
|
|
21
|
+
"platform": "web"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"mcp": "node src/server.mjs",
|
|
26
|
+
"build:client": "tsdown src/client/entry.tsx --format cjs --platform browser --target es2022 --tsconfig tsconfig.client.json --deps.never-bundle react --deps.never-bundle react/jsx-runtime --deps.never-bundle react-dom --deps.never-bundle react-dom/client --out-dir .client-build --clean --logLevel warn && node scripts/build-client.mjs",
|
|
27
|
+
"verify:npm-install": "node scripts/verify-npm-install.mjs",
|
|
28
|
+
"verify:npm-install:official": "node scripts/verify-npm-install.mjs --with-official-dsh",
|
|
29
|
+
"verify:official-bridge": "node scripts/verify-official-bridge-e2e.mjs"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@modelcontextprotocol/sdk": "^1.25.4",
|
|
33
|
+
"zod": "^3.24.0"
|
|
34
|
+
},
|
|
35
|
+
"exports": {
|
|
36
|
+
".": "./src/hub/entry.mjs",
|
|
37
|
+
"./client": "./lib/client.js",
|
|
38
|
+
"./package.json": "./package.json"
|
|
39
|
+
},
|
|
40
|
+
"peerDependencies": {
|
|
41
|
+
"@deepseek-ai/dsh-agent": "0.1.1-rc.2",
|
|
42
|
+
"@deepseek-ai/dsh-agent-presets": "0.1.1-rc.2",
|
|
43
|
+
"@deepseek-ai/dsh-agent-spine-demo": "0.1.1-rc.2",
|
|
44
|
+
"@deepseek-ai/dsh-bash-local": "0.1.1-rc.2",
|
|
45
|
+
"@deepseek-ai/dsh-compaction-basic": "0.1.1-rc.2",
|
|
46
|
+
"@deepseek-ai/dsh-fs-local": "0.1.1-rc.2",
|
|
47
|
+
"@deepseek-ai/dsh-fs-observation-policy": "0.1.1-rc.2",
|
|
48
|
+
"@deepseek-ai/dsh-llm": "0.1.1-rc.2",
|
|
49
|
+
"@deepseek-ai/dsh-llm-deepseek": "0.1.1-rc.2",
|
|
50
|
+
"@deepseek-ai/dsh-sandbox-local": "0.1.1-rc.2",
|
|
51
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.1.1-rc.2",
|
|
52
|
+
"@deepseek-ai/dsh-sdk-client": "0.1.1-rc.2",
|
|
53
|
+
"@deepseek-ai/dsh-sdk-jsonrpc-demo": "0.1.1-rc.2",
|
|
54
|
+
"@deepseek-ai/dsh-sdk-jsonrpc-server": "0.1.1-rc.2",
|
|
55
|
+
"@deepseek-ai/dsh-session": "0.1.1-rc.2",
|
|
56
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "0.1.1-rc.2",
|
|
57
|
+
"@deepseek-ai/dsh-subprocess-local": "0.1.1-rc.2",
|
|
58
|
+
"@deepseek-ai/dsh-token-meter": "0.1.1-rc.2",
|
|
59
|
+
"@deepseek-ai/dsh-tool-fs": "0.1.1-rc.2",
|
|
60
|
+
"@deepseek-ai/dsh-tool-todo": "0.1.1-rc.2",
|
|
61
|
+
"react": "^18.0.0",
|
|
62
|
+
"react-dom": "^18.0.0"
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"@deepseek-ai/dsh-agent": { "optional": true },
|
|
66
|
+
"@deepseek-ai/dsh-agent-presets": { "optional": true },
|
|
67
|
+
"@deepseek-ai/dsh-agent-spine-demo": { "optional": true },
|
|
68
|
+
"@deepseek-ai/dsh-bash-local": { "optional": true },
|
|
69
|
+
"@deepseek-ai/dsh-compaction-basic": { "optional": true },
|
|
70
|
+
"@deepseek-ai/dsh-fs-local": { "optional": true },
|
|
71
|
+
"@deepseek-ai/dsh-fs-observation-policy": { "optional": true },
|
|
72
|
+
"@deepseek-ai/dsh-llm": { "optional": true },
|
|
73
|
+
"@deepseek-ai/dsh-llm-deepseek": { "optional": true },
|
|
74
|
+
"@deepseek-ai/dsh-sandbox-local": { "optional": true },
|
|
75
|
+
"@deepseek-ai/dsh-sandbox-policy": { "optional": true },
|
|
76
|
+
"@deepseek-ai/dsh-sdk-client": { "optional": true },
|
|
77
|
+
"@deepseek-ai/dsh-sdk-jsonrpc-demo": { "optional": true },
|
|
78
|
+
"@deepseek-ai/dsh-sdk-jsonrpc-server": { "optional": true },
|
|
79
|
+
"@deepseek-ai/dsh-session": { "optional": true },
|
|
80
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": { "optional": true },
|
|
81
|
+
"@deepseek-ai/dsh-subprocess-local": { "optional": true },
|
|
82
|
+
"@deepseek-ai/dsh-token-meter": { "optional": true },
|
|
83
|
+
"@deepseek-ai/dsh-tool-fs": { "optional": true },
|
|
84
|
+
"@deepseek-ai/dsh-tool-todo": { "optional": true },
|
|
85
|
+
"react": { "optional": true },
|
|
86
|
+
"react-dom": { "optional": true }
|
|
87
|
+
},
|
|
88
|
+
"devDependencies": {
|
|
89
|
+
"@deepseek-ai/dsh-agent": "0.1.1-rc.2",
|
|
90
|
+
"@deepseek-ai/dsh-agent-presets": "0.1.1-rc.2",
|
|
91
|
+
"@deepseek-ai/dsh-agent-spine-demo": "0.1.1-rc.2",
|
|
92
|
+
"@deepseek-ai/dsh-bash-local": "0.1.1-rc.2",
|
|
93
|
+
"@deepseek-ai/dsh-compaction-basic": "0.1.1-rc.2",
|
|
94
|
+
"@deepseek-ai/dsh-fs-local": "0.1.1-rc.2",
|
|
95
|
+
"@deepseek-ai/dsh-fs-observation-policy": "0.1.1-rc.2",
|
|
96
|
+
"@deepseek-ai/dsh-llm": "0.1.1-rc.2",
|
|
97
|
+
"@deepseek-ai/dsh-llm-deepseek": "0.1.1-rc.2",
|
|
98
|
+
"@deepseek-ai/dsh-sandbox-local": "0.1.1-rc.2",
|
|
99
|
+
"@deepseek-ai/dsh-sandbox-policy": "0.1.1-rc.2",
|
|
100
|
+
"@deepseek-ai/dsh-sdk-client": "0.1.1-rc.2",
|
|
101
|
+
"@deepseek-ai/dsh-sdk-jsonrpc-demo": "0.1.1-rc.2",
|
|
102
|
+
"@deepseek-ai/dsh-sdk-jsonrpc-server": "0.1.1-rc.2",
|
|
103
|
+
"@deepseek-ai/dsh-session": "0.1.1-rc.2",
|
|
104
|
+
"@deepseek-ai/dsh-session-persistence-jsonl": "0.1.1-rc.2",
|
|
105
|
+
"@deepseek-ai/dsh-subprocess-local": "0.1.1-rc.2",
|
|
106
|
+
"@deepseek-ai/dsh-token-meter": "0.1.1-rc.2",
|
|
107
|
+
"@deepseek-ai/dsh-tool-fs": "0.1.1-rc.2",
|
|
108
|
+
"@deepseek-ai/dsh-tool-todo": "0.1.1-rc.2",
|
|
109
|
+
"@types/react": "^18.3.0",
|
|
110
|
+
"react": "^18.3.1",
|
|
111
|
+
"react-dom": "^18.3.1",
|
|
112
|
+
"tsdown": "0.22.14",
|
|
113
|
+
"typescript": "^5.6.0"
|
|
114
|
+
},
|
|
115
|
+
"license": "MIT",
|
|
116
|
+
"repository": {
|
|
117
|
+
"type": "git",
|
|
118
|
+
"url": "git+https://github.com/Ran-sh/dsh-crew.git"
|
|
119
|
+
},
|
|
120
|
+
"homepage": "https://github.com/Ran-sh/dsh-crew",
|
|
121
|
+
"bugs": {
|
|
122
|
+
"url": "https://github.com/Ran-sh/dsh-crew/issues"
|
|
123
|
+
},
|
|
124
|
+
"keywords": [
|
|
125
|
+
"dsh",
|
|
126
|
+
"deepseek",
|
|
127
|
+
"claude-code",
|
|
128
|
+
"codex",
|
|
129
|
+
"zcode",
|
|
130
|
+
"windows",
|
|
131
|
+
"subagent",
|
|
132
|
+
"worker",
|
|
133
|
+
"multimodal",
|
|
134
|
+
"plugin",
|
|
135
|
+
"agent"
|
|
136
|
+
],
|
|
137
|
+
"files": [
|
|
138
|
+
"bin",
|
|
139
|
+
"lib",
|
|
140
|
+
"src",
|
|
141
|
+
"scripts",
|
|
142
|
+
"agents",
|
|
143
|
+
"commands",
|
|
144
|
+
"codex",
|
|
145
|
+
"zcode",
|
|
146
|
+
"statusline",
|
|
147
|
+
"official-web-bridge",
|
|
148
|
+
"windows",
|
|
149
|
+
"cordis.patch.yml",
|
|
150
|
+
"worker.cordis.yml",
|
|
151
|
+
".claude-plugin",
|
|
152
|
+
".mcp.json",
|
|
153
|
+
"README.md",
|
|
154
|
+
"README.*.md",
|
|
155
|
+
"docs/job-contracts.md",
|
|
156
|
+
"docs/readiness-matrix.md",
|
|
157
|
+
"docs/gpt-relay-extension.md",
|
|
158
|
+
"docs/ui-surfaces.md",
|
|
159
|
+
"docs/installation.md",
|
|
160
|
+
"docs/images/dsh-crew-logo.png",
|
|
161
|
+
"docs/images/dsh-crew-overview.png",
|
|
162
|
+
"docs/images/dsh-crew-host.png",
|
|
163
|
+
"docs/images/dsh-crew-jobs.png",
|
|
164
|
+
"LICENSE"
|
|
165
|
+
]
|
|
166
|
+
}
|