@godv61/dsh-task-engine 0.10.0 → 0.13.0

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/lib/client.js CHANGED
@@ -4168,6 +4168,25 @@ var readRuleResultSchema = external_exports.object({
4168
4168
  content: external_exports.string(),
4169
4169
  error: external_exports.string().optional()
4170
4170
  });
4171
+ var taskLedgerItemSchema = external_exports.object({
4172
+ id: external_exports.string(),
4173
+ title: external_exports.string(),
4174
+ status: external_exports.string(),
4175
+ dispatch: external_exports.object({ description: external_exports.string(), at: external_exports.string() }).optional(),
4176
+ review: external_exports.object({
4177
+ spec: external_exports.object({ outcome: external_exports.enum(["pass", "fail"]), notes: external_exports.array(external_exports.string()).optional() }),
4178
+ quality: external_exports.object({ outcome: external_exports.enum(["pass", "fail"]), notes: external_exports.array(external_exports.string()).optional() })
4179
+ }).optional()
4180
+ });
4181
+ var taskLedgerViewSchema = external_exports.object({
4182
+ tasks: external_exports.array(external_exports.object({
4183
+ task_id: external_exports.string(),
4184
+ title: external_exports.string(),
4185
+ stage: external_exports.string(),
4186
+ branch: external_exports.string(),
4187
+ items: external_exports.array(taskLedgerItemSchema)
4188
+ }))
4189
+ });
4171
4190
  var PACKAGE = "@godv61/dsh-task-engine";
4172
4191
  var TYPERT_REMOTE = {
4173
4192
  package: PACKAGE,
@@ -4299,14 +4318,30 @@ var TYPERT_REMOTE = {
4299
4318
  }
4300
4319
  ],
4301
4320
  result: { mode: "strict", typeSymbol: `${PACKAGE}/types#ReadRuleResult`, schema: readRuleResultSchema }
4321
+ },
4322
+ {
4323
+ id: `${PACKAGE}#task-engine/readTasks`,
4324
+ service: "taskEngineController",
4325
+ namespace: "task-engine",
4326
+ method: "readTasks",
4327
+ invocation: { kind: "direct" },
4328
+ parameters: [
4329
+ {
4330
+ name: "path",
4331
+ wire: "path",
4332
+ source: "json",
4333
+ codec: { mode: "strict", typeSymbol: "string", schema: external_exports.string() }
4334
+ }
4335
+ ],
4336
+ result: { mode: "strict", typeSymbol: `${PACKAGE}/types#TaskLedgerView`, schema: taskLedgerViewSchema }
4302
4337
  }
4303
4338
  ]
4304
4339
  };
4305
4340
  var remote_default = TYPERT_REMOTE;
4306
4341
 
4307
4342
  // src/client/Workbench.tsx
4308
- var import_react5 = require("react");
4309
- var import_dsh_client_ui_primitives4 = require("@deepseek-ai/dsh-client-ui-primitives");
4343
+ var import_react6 = require("react");
4344
+ var import_dsh_client_ui_primitives5 = require("@deepseek-ai/dsh-client-ui-primitives");
4310
4345
 
4311
4346
  // src/client/styles.ts
4312
4347
  var text = "var(--dsw-alias-label-primary)";
@@ -5681,6 +5716,152 @@ function RuleManager({ workspace, remote }) {
5681
5716
  );
5682
5717
  }
5683
5718
 
5719
+ // src/client/TaskLedger.tsx
5720
+ var import_react5 = require("react");
5721
+ var import_dsh_client_ui_primitives4 = require("@deepseek-ai/dsh-client-ui-primitives");
5722
+ var card3 = {
5723
+ display: "flex",
5724
+ flexDirection: "column",
5725
+ gap: 10,
5726
+ border: "1px solid var(--dsw-alias-border-l2)",
5727
+ borderRadius: 8,
5728
+ padding: "12px 14px"
5729
+ };
5730
+ var headerRow = {
5731
+ display: "flex",
5732
+ alignItems: "center",
5733
+ gap: 8,
5734
+ flexWrap: "wrap"
5735
+ };
5736
+ var itemRow = {
5737
+ display: "flex",
5738
+ flexDirection: "column",
5739
+ gap: 4,
5740
+ padding: "8px 0",
5741
+ borderTop: "1px solid var(--dsw-alias-border-l2)"
5742
+ };
5743
+ var metaLine = {
5744
+ display: "flex",
5745
+ alignItems: "center",
5746
+ gap: 6,
5747
+ flexWrap: "wrap",
5748
+ fontSize: 12,
5749
+ color: "var(--dsw-alias-label-secondary)"
5750
+ };
5751
+ var badge = {
5752
+ fontSize: 11,
5753
+ padding: "1px 7px",
5754
+ borderRadius: 10,
5755
+ border: "1px solid var(--dsw-alias-border-l2)",
5756
+ color: "var(--dsw-alias-label-secondary)"
5757
+ };
5758
+ function verdictDot(outcome) {
5759
+ return (0, import_react5.createElement)(import_dsh_client_ui_primitives4.StateDot, { state: outcome === "pass" ? "done" : "error" });
5760
+ }
5761
+ function itemStatusDot(status) {
5762
+ return (0, import_react5.createElement)(import_dsh_client_ui_primitives4.StateDot, { state: status === "done" ? "done" : "ongoing" });
5763
+ }
5764
+ function timeText(at) {
5765
+ return at.slice(0, 19).replace("T", " ");
5766
+ }
5767
+ function itemAudit(item) {
5768
+ const lines = [];
5769
+ if (item.dispatch !== void 0) {
5770
+ lines.push((0, import_react5.createElement)(
5771
+ "div",
5772
+ { key: "dispatch", style: metaLine },
5773
+ (0, import_react5.createElement)("span", { style: badge }, "\u5DF2\u6D3E\u53D1"),
5774
+ (0, import_react5.createElement)("span", null, item.dispatch.description === "" ? "\uFF08\u65E0\u63CF\u8FF0\uFF09" : item.dispatch.description),
5775
+ (0, import_react5.createElement)("span", { style: badge }, timeText(item.dispatch.at))
5776
+ ));
5777
+ }
5778
+ if (item.review !== void 0) {
5779
+ const spec = item.review.spec;
5780
+ const quality = item.review.quality;
5781
+ lines.push((0, import_react5.createElement)(
5782
+ "div",
5783
+ { key: "review", style: metaLine },
5784
+ verdictDot(spec.outcome),
5785
+ (0, import_react5.createElement)("span", null, `\u89C4\u683C\u7B26\u5408 ${spec.outcome === "pass" ? "\u901A\u8FC7" : "\u4E0D\u901A\u8FC7"}`),
5786
+ (0, import_react5.createElement)("span", null, "\xB7"),
5787
+ verdictDot(quality.outcome),
5788
+ (0, import_react5.createElement)("span", null, `\u4EE3\u7801\u8D28\u91CF ${quality.outcome === "pass" ? "\u901A\u8FC7" : "\u4E0D\u901A\u8FC7"}`)
5789
+ ));
5790
+ const failNotes = [spec, quality].flatMap((stage) => stage.outcome === "fail" ? stage.notes ?? [] : []);
5791
+ if (failNotes.length > 0) {
5792
+ lines.push((0, import_react5.createElement)(
5793
+ "div",
5794
+ { key: "notes", style: metaLine },
5795
+ ...failNotes.map((note) => (0, import_react5.createElement)("span", { key: note, style: badge }, note))
5796
+ ));
5797
+ }
5798
+ }
5799
+ if (lines.length === 0) {
5800
+ lines.push((0, import_react5.createElement)("div", { key: "none", style: metaLine }, (0, import_react5.createElement)("span", { style: badge }, "\u672A\u6D3E\u53D1 / \u672A\u5BA1\u67E5")));
5801
+ }
5802
+ return (0, import_react5.createElement)("div", { style: { display: "flex", flexDirection: "column", gap: 4 } }, ...lines);
5803
+ }
5804
+ function TaskLedger({ workspace, remote }) {
5805
+ const [tasks, setTasks] = (0, import_react5.useState)([]);
5806
+ const [error, setError] = (0, import_react5.useState)("");
5807
+ const refresh = (0, import_react5.useCallback)(() => {
5808
+ if (workspace === "") return;
5809
+ setError("");
5810
+ void remote.readTasks(workspace).then((result) => {
5811
+ if (result.ok) setTasks(result.value.tasks);
5812
+ else setError("\u8BFB\u53D6\u53F0\u8D26\u5931\u8D25\uFF1A" + describeError(result.error));
5813
+ }, (reason) => {
5814
+ setError("\u8BFB\u53D6\u53F0\u8D26\u5931\u8D25\uFF1A" + describeError(reason));
5815
+ });
5816
+ }, [remote, workspace]);
5817
+ (0, import_react5.useEffect)(() => {
5818
+ refresh();
5819
+ }, [refresh]);
5820
+ return (0, import_react5.createElement)(
5821
+ "div",
5822
+ { style: styles.section },
5823
+ (0, import_react5.createElement)(
5824
+ "div",
5825
+ { style: headerRow },
5826
+ (0, import_react5.createElement)("span", { style: styles.bindingLabel }, "\u4EFB\u52A1\u53F0\u8D26"),
5827
+ (0, import_react5.createElement)("span", { style: styles.sourceBadge }, "\u53EA\u8BFB \xB7 \u6765\u81EA .dsh/task-*.json"),
5828
+ (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Button, { variant: "outline", size: "sm", onClick: refresh }, "\u5237\u65B0")
5829
+ ),
5830
+ error !== "" ? (0, import_react5.createElement)("p", { style: styles.status }, error) : tasks.length === 0 ? (0, import_react5.createElement)("p", { style: styles.muted }, "\u5F53\u524D\u5DE5\u4F5C\u533A\u8FD8\u6CA1\u6709\u4EFB\u52A1\uFF1A\u5F00\u5DE5\u540E\uFF08dev_task create\uFF09\u4F1A\u5728\u8FD9\u91CC\u5217\u51FA\u6D3E\u53D1\u4E0E\u5BA1\u67E5\u7559\u75D5\u3002") : (0, import_react5.createElement)(
5831
+ "div",
5832
+ { style: { display: "flex", flexDirection: "column", gap: 12 } },
5833
+ ...tasks.map((task) => (0, import_react5.createElement)(
5834
+ "div",
5835
+ { key: task.task_id, style: card3 },
5836
+ (0, import_react5.createElement)(
5837
+ "div",
5838
+ { style: headerRow },
5839
+ (0, import_react5.createElement)("span", { style: { fontSize: 14, fontWeight: 600, color: "var(--dsw-alias-label-primary)" } }, task.task_id),
5840
+ (0, import_react5.createElement)("span", { style: { fontSize: 13, color: "var(--dsw-alias-label-primary)" } }, task.title),
5841
+ (0, import_react5.createElement)("span", { style: badge }, task.stage),
5842
+ (0, import_react5.createElement)("span", { style: badge }, task.branch)
5843
+ ),
5844
+ (0, import_react5.createElement)(
5845
+ "div",
5846
+ { style: { display: "flex", flexDirection: "column" } },
5847
+ ...task.items.map((item) => (0, import_react5.createElement)(
5848
+ "div",
5849
+ { key: item.id, style: itemRow },
5850
+ (0, import_react5.createElement)(
5851
+ "div",
5852
+ { style: headerRow },
5853
+ itemStatusDot(item.status),
5854
+ (0, import_react5.createElement)("span", { style: { fontSize: 13, color: "var(--dsw-alias-label-primary)" } }, item.id),
5855
+ (0, import_react5.createElement)("span", { style: { fontSize: 12, color: "var(--dsw-alias-label-secondary)" } }, item.title)
5856
+ ),
5857
+ itemAudit(item)
5858
+ ))
5859
+ )
5860
+ ))
5861
+ )
5862
+ );
5863
+ }
5864
+
5684
5865
  // src/client/Workbench.tsx
5685
5866
  var overlay = {
5686
5867
  position: "absolute",
@@ -5732,58 +5913,59 @@ var closeStyle = {
5732
5913
  };
5733
5914
  var TABS = [
5734
5915
  { id: "flow", label: "\u6D41\u7A0B\u914D\u7F6E" },
5916
+ { id: "tasks", label: "\u4EFB\u52A1\u53F0\u8D26" },
5735
5917
  { id: "skills", label: "\u6280\u80FD skill" },
5736
5918
  { id: "rules", label: "\u89C4\u5219 rule" }
5737
5919
  ];
5738
5920
  function Workbench({ useStore, actions, useWorkspaces, remote }) {
5739
5921
  const open = useStore((s) => s.open);
5740
5922
  const workspaces = useWorkspaces((s) => s.items);
5741
- const [tab, setTab] = (0, import_react5.useState)("flow");
5742
- const [workspace, setWorkspace] = (0, import_react5.useState)("");
5923
+ const [tab, setTab] = (0, import_react6.useState)("flow");
5924
+ const [workspace, setWorkspace] = (0, import_react6.useState)("");
5743
5925
  if (!open) return null;
5744
5926
  const current = workspaces.some((w) => w.path === workspace) ? workspace : workspaces[0]?.path ?? "";
5745
- return (0, import_react5.createElement)(
5927
+ return (0, import_react6.createElement)(
5746
5928
  "div",
5747
5929
  { style: overlay },
5748
- (0, import_react5.createElement)(
5930
+ (0, import_react6.createElement)(
5749
5931
  "div",
5750
5932
  { style: header },
5751
- (0, import_react5.createElement)("span", { style: { fontSize: 15, fontWeight: 600, color: "var(--dsw-alias-label-primary)" } }, "\u5DE5\u7A0B\u6D41\u7A0B"),
5752
- (0, import_react5.createElement)(
5933
+ (0, import_react6.createElement)("span", { style: { fontSize: 15, fontWeight: 600, color: "var(--dsw-alias-label-primary)" } }, "\u5DE5\u7A0B\u6D41\u7A0B"),
5934
+ (0, import_react6.createElement)(
5753
5935
  "button",
5754
5936
  { type: "button", title: "\u5173\u95ED", onClick: () => {
5755
5937
  actions.close();
5756
5938
  }, style: closeStyle },
5757
- (0, import_react5.createElement)(import_dsh_client_ui_primitives4.IconCloseOutline16, { size: 16 })
5939
+ (0, import_react6.createElement)(import_dsh_client_ui_primitives5.IconCloseOutline16, { size: 16 })
5758
5940
  )
5759
5941
  ),
5760
- (0, import_react5.createElement)(
5942
+ (0, import_react6.createElement)(
5761
5943
  "div",
5762
5944
  { style: tabbar },
5763
- ...TABS.map((t) => (0, import_react5.createElement)(import_dsh_client_ui_primitives4.Pill, { key: t.id, active: tab === t.id, onClick: () => {
5945
+ ...TABS.map((t) => (0, import_react6.createElement)(import_dsh_client_ui_primitives5.Pill, { key: t.id, active: tab === t.id, onClick: () => {
5764
5946
  setTab(t.id);
5765
5947
  } }, t.label)),
5766
- workspaces.length > 0 ? (0, import_react5.createElement)("select", {
5948
+ workspaces.length > 0 ? (0, import_react6.createElement)("select", {
5767
5949
  style: selectStyle,
5768
5950
  value: current,
5769
5951
  onChange: (ev) => {
5770
5952
  setWorkspace(ev.target.value);
5771
5953
  }
5772
- }, ...workspaces.map((w) => (0, import_react5.createElement)("option", { key: w.path, value: w.path }, w.title || w.path))) : null
5954
+ }, ...workspaces.map((w) => (0, import_react6.createElement)("option", { key: w.path, value: w.path }, w.title || w.path))) : null
5773
5955
  ),
5774
- (0, import_react5.createElement)(
5956
+ (0, import_react6.createElement)(
5775
5957
  "div",
5776
5958
  { style: body },
5777
- current === "" ? (0, import_react5.createElement)("p", { style: styles.muted }, "\u5F53\u524D\u6CA1\u6709\u5DE5\u4F5C\u533A\uFF1A\u8BF7\u5148\u5728\u4FA7\u680F\u521B\u5EFA\u4E00\u4E2A\u5DE5\u4F5C\u533A\uFF0C\u518D\u56DE\u6765\u914D\u7F6E\u6D41\u7A0B\u3002") : tab === "flow" ? (0, import_react5.createElement)(TaskEngineSection, { workspace: current, remote }) : tab === "skills" ? (0, import_react5.createElement)(SkillManager, { workspace: current, remote }) : (0, import_react5.createElement)(RuleManager, { workspace: current, remote })
5959
+ current === "" ? (0, import_react6.createElement)("p", { style: styles.muted }, "\u5F53\u524D\u6CA1\u6709\u5DE5\u4F5C\u533A\uFF1A\u8BF7\u5148\u5728\u4FA7\u680F\u521B\u5EFA\u4E00\u4E2A\u5DE5\u4F5C\u533A\uFF0C\u518D\u56DE\u6765\u914D\u7F6E\u6D41\u7A0B\u3002") : tab === "flow" ? (0, import_react6.createElement)(TaskEngineSection, { workspace: current, remote }) : tab === "tasks" ? (0, import_react6.createElement)(TaskLedger, { workspace: current, remote }) : tab === "skills" ? (0, import_react6.createElement)(SkillManager, { workspace: current, remote }) : (0, import_react6.createElement)(RuleManager, { workspace: current, remote })
5778
5960
  )
5779
5961
  );
5780
5962
  }
5781
5963
 
5782
5964
  // src/client/TriggerButton.tsx
5783
- var import_react6 = require("react");
5784
- var import_dsh_client_ui_primitives5 = require("@deepseek-ai/dsh-client-ui-primitives");
5965
+ var import_react7 = require("react");
5966
+ var import_dsh_client_ui_primitives6 = require("@deepseek-ai/dsh-client-ui-primitives");
5785
5967
  function TriggerButton({ wide, actions }) {
5786
- return (0, import_react6.createElement)(
5968
+ return (0, import_react7.createElement)(
5787
5969
  "button",
5788
5970
  {
5789
5971
  type: "button",
@@ -5808,8 +5990,8 @@ function TriggerButton({ wide, actions }) {
5808
5990
  boxSizing: "border-box"
5809
5991
  }
5810
5992
  },
5811
- (0, import_react6.createElement)(import_dsh_client_ui_primitives5.IconSettingsOutline16, { size: wide ? 16 : 18 }),
5812
- wide ? (0, import_react6.createElement)("span", { style: { fontSize: 13 } }, "\u5DE5\u7A0B\u6D41\u7A0B") : null
5993
+ (0, import_react7.createElement)(import_dsh_client_ui_primitives6.IconSettingsOutline16, { size: wide ? 16 : 18 }),
5994
+ wide ? (0, import_react7.createElement)("span", { style: { fontSize: 13 } }, "\u5DE5\u7A0B\u6D41\u7A0B") : null
5813
5995
  );
5814
5996
  }
5815
5997