@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.
@@ -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.ownership === "harness" || record.desired_state === "absent" || Number(record.references?.active_jobs ?? 0) > 0) {
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.ownership !== "harness" && (item.models?.length ?? 0) > 0)?.id ?? "";
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
- setNotice(String(error?.message ?? error));
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
- if (!record || !transactionId || record.desired_state !== "absent") {
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 = await post(`/providers/${encoded}/rollback`, {
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 ?? "follow-dsh",
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 blocked = record.ownership === "harness" || record.desired_state === "absent" || Number(record.references?.active_jobs ?? 0) > 0;
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 rollbackTransaction = (providerInventory?.lifecycle_transactions ?? []).find((entry) => entry.provider_id === record.id && ["VERIFIED", "RESTART_PENDING"].includes(entry.state));
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.ownership !== "harness" && record.desired_state !== "absent" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
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" && rollbackTransaction && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
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.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
+ }