@godv61/dsh-task-engine 0.30.0 → 0.30.1

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
@@ -4309,6 +4309,35 @@ var initDraftSchema = external_exports.object({
4309
4309
  lines: external_exports.number(),
4310
4310
  error: external_exports.string().optional()
4311
4311
  });
4312
+ var projectInitResourceSchema = external_exports.object({
4313
+ kind: external_exports.enum(["skill", "rule"]),
4314
+ name: external_exports.string(),
4315
+ description: external_exports.string().optional(),
4316
+ content: external_exports.string(),
4317
+ meta_skills: external_exports.array(external_exports.string()).optional(),
4318
+ rules: external_exports.array(external_exports.string()).optional()
4319
+ });
4320
+ var projectInitInventorySchema = external_exports.object({
4321
+ project_name: external_exports.string(),
4322
+ root_entries: external_exports.array(external_exports.string()),
4323
+ modules: external_exports.array(external_exports.object({ path: external_exports.string(), entries: external_exports.array(external_exports.string()) })),
4324
+ manifests: external_exports.array(external_exports.object({ path: external_exports.string(), facts: external_exports.array(external_exports.string()) })),
4325
+ suggestions: external_exports.array(external_exports.object({ name: external_exports.string(), kind: external_exports.enum(["skill", "rule"]), meta_skills: external_exports.array(external_exports.string()), why: external_exports.string() })),
4326
+ caution: external_exports.string()
4327
+ });
4328
+ var projectInitPreviewRequestSchema = external_exports.object({ path: external_exports.string(), resources: external_exports.array(projectInitResourceSchema) });
4329
+ var projectInitPreviewSchema = external_exports.object({
4330
+ ok: external_exports.boolean(),
4331
+ inventory: projectInitInventorySchema,
4332
+ resources: external_exports.array(projectInitResourceSchema),
4333
+ files_to_create: external_exports.array(external_exports.string()),
4334
+ project_map_coverage: external_exports.array(external_exports.string()),
4335
+ existing_hash: external_exports.string(),
4336
+ expected_hash: external_exports.string(),
4337
+ error: external_exports.string().optional()
4338
+ });
4339
+ var projectInitApplyRequestSchema = projectInitPreviewRequestSchema.extend({ expected_hash: external_exports.string(), existing_hash: external_exports.string() });
4340
+ var projectInitApplyResultSchema = external_exports.object({ ok: external_exports.boolean(), created: external_exports.array(external_exports.string()), error: external_exports.string().optional() });
4312
4341
  var resourceRequestSchema = external_exports.object({
4313
4342
  kind: external_exports.enum(["skill", "rule"]),
4314
4343
  level: external_exports.enum(["project", "user"]),
@@ -4740,6 +4769,48 @@ var TYPERT_REMOTE = {
4740
4769
  }
4741
4770
  ],
4742
4771
  result: { mode: "strict", typeSymbol: `${PACKAGE}/types#InitDraft`, create: () => initDraftSchema, schema: initDraftSchema }
4772
+ },
4773
+ {
4774
+ id: `${PACKAGE}#task-engine/generateProjectInit`,
4775
+ service: "taskEngineController",
4776
+ namespace: "task-engine",
4777
+ method: "generateProjectInit",
4778
+ invocation: { kind: "direct" },
4779
+ parameters: [{
4780
+ name: "request",
4781
+ wire: "request",
4782
+ source: "json",
4783
+ codec: { mode: "strict", typeSymbol: `${PACKAGE}/types#InitGenerateRequest`, create: () => initGenerateRequestSchema, schema: initGenerateRequestSchema }
4784
+ }],
4785
+ result: { mode: "strict", typeSymbol: `${PACKAGE}/types#ProjectInitPreview`, create: () => projectInitPreviewSchema, schema: projectInitPreviewSchema }
4786
+ },
4787
+ {
4788
+ id: `${PACKAGE}#task-engine/previewProjectInit`,
4789
+ service: "taskEngineController",
4790
+ namespace: "task-engine",
4791
+ method: "previewProjectInit",
4792
+ invocation: { kind: "direct" },
4793
+ parameters: [{
4794
+ name: "request",
4795
+ wire: "request",
4796
+ source: "json",
4797
+ codec: { mode: "strict", typeSymbol: `${PACKAGE}/types#ProjectInitPreviewRequest`, create: () => projectInitPreviewRequestSchema, schema: projectInitPreviewRequestSchema }
4798
+ }],
4799
+ result: { mode: "strict", typeSymbol: `${PACKAGE}/types#ProjectInitPreview`, create: () => projectInitPreviewSchema, schema: projectInitPreviewSchema }
4800
+ },
4801
+ {
4802
+ id: `${PACKAGE}#task-engine/applyProjectInit`,
4803
+ service: "taskEngineController",
4804
+ namespace: "task-engine",
4805
+ method: "applyProjectInit",
4806
+ invocation: { kind: "direct" },
4807
+ parameters: [{
4808
+ name: "request",
4809
+ wire: "request",
4810
+ source: "json",
4811
+ codec: { mode: "strict", typeSymbol: `${PACKAGE}/types#ProjectInitApplyRequest`, create: () => projectInitApplyRequestSchema, schema: projectInitApplyRequestSchema }
4812
+ }],
4813
+ result: { mode: "strict", typeSymbol: `${PACKAGE}/types#ProjectInitApplyResult`, create: () => projectInitApplyResultSchema, schema: projectInitApplyResultSchema }
4743
4814
  }
4744
4815
  ]
4745
4816
  };
@@ -5773,7 +5844,6 @@ var card2 = {
5773
5844
  borderRadius: 8,
5774
5845
  padding: "12px 14px"
5775
5846
  };
5776
- var projectInitPrompt = (workspace) => `\u8BF7\u5728\u5F53\u524D\u9879\u76EE\u6839\u5DE5\u4F5C\u533A ${workspace} \u4F7F\u7528\u5DE5\u7A0B\u5316\u5F00\u53D1\u5F15\u64CE\u521D\u59CB\u5316\u9879\u76EE Skill \u548C Rule\u3002\u5148\u8C03\u7528 dev_task init_project\uFF08phase=inspect\uFF09\uFF0C\u7ED3\u5408\u4EE3\u8868\u6027\u6E90\u7801\u3001\u6784\u5EFA\u6587\u4EF6\u3001\u6D4B\u8BD5\u548C\u5DF2\u6709\u89C4\u8303\u6838\u5B9E\u626B\u63CF\u7ED3\u679C\u3002\u6309\u9879\u76EE\u5B9E\u9645\u60C5\u51B5\u62DF\u5B9A\u9879\u76EE\u7ED3\u6784\u5730\u56FE\u3001\u6280\u672F\u6808\u3001\u7F16\u7801\u65B9\u6CD5\u7B49 Skill \u548C\u5FC5\u8981\u7684 Rule\uFF0C\u5E76\u6807\u660E\u9002\u7528\u7684\u5143\u6280\u80FD\u3002\u9879\u76EE\u5730\u56FE\u5FC5\u987B\u603B\u7ED3\u6574\u4E2A\u4ED3\u5E93\u7684\u6A21\u5757\u804C\u8D23\u3001\u4F9D\u8D56\u548C\u901A\u7528\u4EE3\u7801\u5165\u53E3\uFF0C\u80FD\u591F\u4F9B\u4E0D\u540C\u9700\u6C42\u590D\u7528\uFF1B\u4E0D\u8981\u628A\u5F53\u524D\u4F1A\u8BDD\u7684\u9700\u6C42\u3001\u4E13\u5C5E\u8C03\u7528\u94FE\u6216\u5B9E\u73B0\u65B9\u6848\u5199\u6210\u9879\u76EE\u5730\u56FE\uFF0C\u76F8\u5173\u5185\u5BB9\u5E94\u8FDB\u5165\u8BE5\u4EFB\u52A1\u4EA7\u7269\u6216\u5355\u72EC\u7684\u9886\u57DF Skill\u3002\u8C03\u7528 phase=propose \u5C55\u793A\u62DF\u521B\u5EFA\u7684\u6587\u4EF6\u3001\u5185\u5BB9\u548C\u6302\u8F7D\u5173\u7CFB\uFF1B\u7B49\u6211\u5BA1\u9605\u786E\u8BA4\u540E\u518D\u8C03\u7528 phase=apply\u3002\u4E0D\u8981\u8986\u76D6\u540C\u540D\u8D44\u6E90\uFF0C\u4E5F\u4E0D\u8981\u628A\u5076\u53D1\u4EE3\u7801\u5199\u6CD5\u5F53\u6210\u56E2\u961F\u89C4\u8303\u3002`;
5777
5847
  function InitPanel({ workspace, remote }) {
5778
5848
  const [view, setView] = (0, import_react4.useState)(null);
5779
5849
  const [generating, setGenerating] = (0, import_react4.useState)(false);
@@ -5783,8 +5853,11 @@ function InitPanel({ workspace, remote }) {
5783
5853
  const [body2, setBody] = (0, import_react4.useState)("");
5784
5854
  const [msg, setMsg] = (0, import_react4.useState)("");
5785
5855
  const [projectInitMsg, setProjectInitMsg] = (0, import_react4.useState)("");
5856
+ const [projectBusy, setProjectBusy] = (0, import_react4.useState)(false);
5857
+ const [projectDraft, setProjectDraft] = (0, import_react4.useState)(null);
5858
+ const [projectResources, setProjectResources] = (0, import_react4.useState)([]);
5786
5859
  (0, import_react4.useEffect)(() => {
5787
- if (!generating) {
5860
+ if (!generating && !projectBusy) {
5788
5861
  setElapsed(0);
5789
5862
  return;
5790
5863
  }
@@ -5796,7 +5869,73 @@ function InitPanel({ workspace, remote }) {
5796
5869
  return () => {
5797
5870
  clearInterval(timer);
5798
5871
  };
5799
- }, [generating]);
5872
+ }, [generating, projectBusy]);
5873
+ (0, import_react4.useEffect)(() => {
5874
+ setProjectDraft(null);
5875
+ setProjectResources([]);
5876
+ setProjectInitMsg("");
5877
+ }, [workspace]);
5878
+ const generateProject = async () => {
5879
+ setProjectBusy(true);
5880
+ setProjectDraft(null);
5881
+ setProjectResources([]);
5882
+ setProjectInitMsg("");
5883
+ try {
5884
+ const result = await remote.generateProjectInit({ path: workspace });
5885
+ if (!result.ok) throw new Error(describeError(result.error));
5886
+ if (!result.value.ok) throw new Error(result.value.error ?? "\u9879\u76EE\u521D\u59CB\u5316\u63D0\u6848\u65E0\u6548");
5887
+ setProjectDraft(result.value);
5888
+ setProjectResources(result.value.resources);
5889
+ setProjectInitMsg("\u63D0\u6848\u5DF2\u751F\u6210\u5E76\u6821\u9A8C\u3002\u8BF7\u9010\u9879\u5BA1\u9605\u5185\u5BB9\u4E0E\u6302\u8F7D\u5173\u7CFB\uFF0C\u786E\u8BA4\u540E\u518D\u5199\u5165\u3002");
5890
+ } catch (error) {
5891
+ setProjectInitMsg(`\u751F\u6210\u5931\u8D25\uFF1A${error instanceof Error ? error.message : String(error)}`);
5892
+ } finally {
5893
+ setProjectBusy(false);
5894
+ }
5895
+ };
5896
+ const updateProjectResource = (index, change) => {
5897
+ setProjectResources((current) => current.map((resource, at) => at === index ? { ...resource, ...change } : resource));
5898
+ setProjectDraft(null);
5899
+ setProjectInitMsg("\u63D0\u6848\u5DF2\u4FEE\u6539\u3002\u8BF7\u5148\u70B9\u51FB\u201C\u68C0\u67E5\u4FEE\u6539\u201D\uFF0C\u901A\u8FC7\u540E\u624D\u80FD\u5199\u5165\u3002");
5900
+ };
5901
+ const checkProject = async () => {
5902
+ setProjectBusy(true);
5903
+ setProjectInitMsg("");
5904
+ try {
5905
+ const result = await remote.previewProjectInit({ path: workspace, resources: projectResources });
5906
+ if (!result.ok) throw new Error(describeError(result.error));
5907
+ if (!result.value.ok) throw new Error(result.value.error ?? "\u63D0\u6848\u6821\u9A8C\u5931\u8D25");
5908
+ setProjectDraft(result.value);
5909
+ setProjectInitMsg("\u63D0\u6848\u68C0\u67E5\u901A\u8FC7\uFF0C\u53EF\u4EE5\u786E\u8BA4\u5199\u5165\u3002");
5910
+ } catch (error) {
5911
+ setProjectDraft(null);
5912
+ setProjectInitMsg(`\u68C0\u67E5\u5931\u8D25\uFF1A${error instanceof Error ? error.message : String(error)}`);
5913
+ } finally {
5914
+ setProjectBusy(false);
5915
+ }
5916
+ };
5917
+ const applyProject = async () => {
5918
+ if (projectDraft === null || !window.confirm(`\u786E\u8BA4\u5728 ${workspace} \u521B\u5EFA ${projectDraft.files_to_create.length} \u4E2A Skill / Rule \u6587\u4EF6\u5E76\u66F4\u65B0 .dsh/meta.json\uFF1F`)) return;
5919
+ setProjectBusy(true);
5920
+ setProjectInitMsg("");
5921
+ try {
5922
+ const result = await remote.applyProjectInit({
5923
+ path: workspace,
5924
+ resources: projectDraft.resources,
5925
+ expected_hash: projectDraft.expected_hash,
5926
+ existing_hash: projectDraft.existing_hash
5927
+ });
5928
+ if (!result.ok) throw new Error(describeError(result.error));
5929
+ if (!result.value.ok) throw new Error(result.value.error ?? "\u5199\u5165\u5931\u8D25");
5930
+ setProjectInitMsg(`\u5DF2\u521B\u5EFA ${result.value.created.length} \u4E2A\u9879\u76EE\u914D\u7F6E\u6587\u4EF6\uFF1A${result.value.created.join("\u3001")}`);
5931
+ setProjectDraft(null);
5932
+ setProjectResources([]);
5933
+ } catch (error) {
5934
+ setProjectInitMsg(`\u5199\u5165\u5931\u8D25\uFF1A${error instanceof Error ? error.message : String(error)}\u3002\u82E5\u5DF2\u6709\u90E8\u5206\u6587\u4EF6\uFF0C\u8BF7\u5237\u65B0\u5E76\u68C0\u67E5\u3002`);
5935
+ } finally {
5936
+ setProjectBusy(false);
5937
+ }
5938
+ };
5800
5939
  const refresh = (0, import_react4.useCallback)(() => {
5801
5940
  void remote.readInit(workspace).then((r) => {
5802
5941
  if (r.ok) setView(r.value);
@@ -5856,39 +5995,108 @@ function InitPanel({ workspace, remote }) {
5856
5995
  (0, import_react4.createElement)(
5857
5996
  "p",
5858
5997
  { style: styles.muted },
5859
- "\u626B\u63CF\u53EA\u8FD4\u56DE\u9879\u76EE\u8BC1\u636E\u4E0E\u5EFA\u8BAE\u540D\u79F0\uFF1B\u4F1A\u8BDD\u6A21\u578B\u636E\u6B64\u62DF\u5B9A\u8986\u76D6\u6574\u4E2A\u4ED3\u5E93\u7684\u9879\u76EE\u5730\u56FE\u3001\u6280\u672F\u6808\u3001\u7F16\u7801 Skill \u548C Rule\u3002\u5F53\u524D\u9700\u6C42\u7684\u4E13\u5C5E\u4FE1\u606F\u5E94\u5199\u5165\u4EFB\u52A1\u4EA7\u7269\u3002\u5148\u9884\u89C8\u751F\u6210\u5185\u5BB9\uFF0C\u786E\u8BA4\u540E\u624D\u5199\u5165\u9879\u76EE\uFF1B\u5DF2\u6709\u540C\u540D\u8D44\u6E90\u4E0D\u4F1A\u88AB\u8986\u76D6\u3002"
5998
+ "\u5728\u6B64\u626B\u63CF\u4ED3\u5E93\u5E76\u751F\u6210\u9879\u76EE Skill / Rule \u63D0\u6848\u3002\u9879\u76EE\u5730\u56FE\u8986\u76D6\u6574\u4E2A\u4ED3\u5E93\uFF0C\u5F53\u524D\u9700\u6C42\u7684\u4E13\u5C5E\u4FE1\u606F\u5E94\u5199\u5165\u4EFB\u52A1\u4EA7\u7269\u3002\u9010\u9879\u5BA1\u9605\u540E\u786E\u8BA4\u5199\u5165\uFF1B\u5DF2\u6709\u540C\u540D\u8D44\u6E90\u4E0D\u4F1A\u88AB\u8986\u76D6\u3002"
5860
5999
  ),
5861
6000
  (0, import_react4.createElement)(
5862
6001
  "p",
5863
6002
  { style: styles.muted },
5864
6003
  "\u56E2\u961F\u5171\u4EAB\u65F6\uFF0C\u8BF7\u5C06\u751F\u6210\u7684 .dsh/skills\u3001.dsh/rules \u548C .dsh/meta.json \u7EB3\u5165 Git\uFF1B\u5BA1\u6838\u62A5\u544A\u53EF\u4FDD\u7559\u5728\u672C\u5730\u3002"
5865
6004
  ),
5866
- (0, import_react4.createElement)(
5867
- "p",
5868
- { style: styles.muted },
5869
- "\u4F7F\u7528\u65B9\u6CD5\uFF1A\u5173\u95ED\u6B64\u9762\u677F\uFF0C\u5728\u5F53\u524D\u9879\u76EE\u6839\u5DE5\u4F5C\u533A\u9009\u62E9\u201C\u5DE5\u7A0B\u5316\u5F00\u53D1\u5F15\u64CE\u201D\uFF0C\u628A\u4E0B\u9762\u7684\u8BF7\u6C42\u53D1\u7ED9\u65B0\u4F1A\u8BDD\u3002"
5870
- ),
5871
- (0, import_react4.createElement)("textarea", {
5872
- style: { ...styles.textarea, minHeight: 100 },
5873
- readOnly: true,
5874
- "aria-label": "\u9879\u76EE Skill \u548C Rule \u521D\u59CB\u5316\u8BF7\u6C42",
5875
- value: projectInitPrompt(workspace)
5876
- }),
5877
6005
  (0, import_react4.createElement)(
5878
6006
  "div",
5879
6007
  { style: styles.row },
5880
- (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, { variant: "primary", size: "md", onClick: () => {
5881
- if (!navigator.clipboard?.writeText) {
5882
- setProjectInitMsg("\u5F53\u524D\u6D4F\u89C8\u5668\u4E0D\u652F\u6301\u4E00\u952E\u590D\u5236\u3002\u8BF7\u76F4\u63A5\u9009\u4E2D\u4E0A\u65B9\u8BF7\u6C42\u6587\u672C\u5E76\u590D\u5236\u3002");
5883
- return;
6008
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6009
+ variant: "primary",
6010
+ size: "md",
6011
+ disabled: projectBusy,
6012
+ onClick: () => {
6013
+ void generateProject();
5884
6014
  }
5885
- void navigator.clipboard.writeText(projectInitPrompt(workspace)).then(
5886
- () => setProjectInitMsg("\u5DF2\u590D\u5236\u521D\u59CB\u5316\u8BF7\u6C42\u3002\u8BF7\u5728\u5DE5\u7A0B\u5316\u5F00\u53D1\u5F15\u64CE\u4F1A\u8BDD\u4E2D\u7C98\u8D34\u53D1\u9001\u3002"),
5887
- () => setProjectInitMsg("\u590D\u5236\u5931\u8D25\u3002\u8BF7\u76F4\u63A5\u9009\u4E2D\u4E0A\u65B9\u8BF7\u6C42\u6587\u672C\u5E76\u590D\u5236\u3002")
5888
- );
5889
- } }, "\u590D\u5236\u521D\u59CB\u5316\u8BF7\u6C42"),
5890
- projectInitMsg ? (0, import_react4.createElement)("span", { role: "status", style: styles.status }, projectInitMsg) : null
5891
- )
6015
+ }, projectBusy ? "\u626B\u63CF\u4E0E\u751F\u6210\u4E2D\u2026" : "\u626B\u63CF\u5E76\u751F\u6210\u63D0\u6848"),
6016
+ projectBusy ? (0, import_react4.createElement)("span", { style: styles.status }, `\u5DF2\u8017\u65F6 ${elapsed} \u79D2`) : null
6017
+ ),
6018
+ projectResources.length > 0 ? (0, import_react4.createElement)(
6019
+ "div",
6020
+ { style: styles.section },
6021
+ (0, import_react4.createElement)(
6022
+ "p",
6023
+ { style: styles.muted },
6024
+ `\u9879\u76EE\uFF1A${workspace}\u3002\u63D0\u6848\u5305\u542B ${projectResources.length} \u4E2A Skill / Rule\uFF1B\u9879\u76EE\u5730\u56FE\u9700\u8986\u76D6\uFF1A${projectDraft?.project_map_coverage.join("\u3001") ?? "\u68C0\u67E5\u4FEE\u6539\u540E\u663E\u793A"}\u3002`
6025
+ ),
6026
+ ...projectResources.map((resource, index) => (0, import_react4.createElement)(
6027
+ "div",
6028
+ { key: `${resource.kind}-${resource.name}`, style: card2 },
6029
+ (0, import_react4.createElement)(
6030
+ "div",
6031
+ { style: styles.row },
6032
+ (0, import_react4.createElement)("strong", null, `${resource.kind === "skill" ? "Skill" : "Rule"} \xB7 ${resource.name}`),
6033
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6034
+ variant: "ghost",
6035
+ size: "sm",
6036
+ disabled: projectBusy,
6037
+ onClick: () => {
6038
+ setProjectResources((current) => current.filter((_, at) => at !== index));
6039
+ setProjectDraft(null);
6040
+ setProjectInitMsg("\u5DF2\u79FB\u9664\u5EFA\u8BAE\u3002\u8BF7\u91CD\u65B0\u68C0\u67E5\u63D0\u6848\u3002");
6041
+ }
6042
+ }, "\u79FB\u9664\u5EFA\u8BAE")
6043
+ ),
6044
+ resource.kind === "skill" ? (0, import_react4.createElement)(
6045
+ "div",
6046
+ { style: styles.section },
6047
+ (0, import_react4.createElement)("label", null, "\u7B80\u4ECB", (0, import_react4.createElement)("input", {
6048
+ style: styles.input,
6049
+ value: resource.description ?? "",
6050
+ onChange: (event) => {
6051
+ updateProjectResource(index, { description: event.target.value });
6052
+ }
6053
+ })),
6054
+ (0, import_react4.createElement)("label", null, "\u6302\u8F7D\u5143\u6280\u80FD\uFF08\u9017\u53F7\u5206\u9694\uFF09", (0, import_react4.createElement)("input", {
6055
+ style: styles.input,
6056
+ value: (resource.meta_skills ?? []).join(", "),
6057
+ onChange: (event) => {
6058
+ updateProjectResource(index, { meta_skills: event.target.value.split(",").map((item) => item.trim()).filter(Boolean) });
6059
+ }
6060
+ })),
6061
+ (0, import_react4.createElement)("label", null, "\u5173\u8054 Rule\uFF08\u9017\u53F7\u5206\u9694\uFF09", (0, import_react4.createElement)("input", {
6062
+ style: styles.input,
6063
+ value: (resource.rules ?? []).join(", "),
6064
+ onChange: (event) => {
6065
+ updateProjectResource(index, { rules: event.target.value.split(",").map((item) => item.trim()).filter(Boolean) });
6066
+ }
6067
+ }))
6068
+ ) : null,
6069
+ (0, import_react4.createElement)("label", null, "\u5185\u5BB9", (0, import_react4.createElement)("textarea", {
6070
+ style: { ...styles.textarea, minHeight: 180 },
6071
+ value: resource.content,
6072
+ onChange: (event) => {
6073
+ updateProjectResource(index, { content: event.target.value });
6074
+ }
6075
+ }))
6076
+ )),
6077
+ (0, import_react4.createElement)(
6078
+ "div",
6079
+ { style: styles.row },
6080
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6081
+ variant: "outline",
6082
+ size: "md",
6083
+ disabled: projectBusy,
6084
+ onClick: () => {
6085
+ void checkProject();
6086
+ }
6087
+ }, "\u68C0\u67E5\u4FEE\u6539"),
6088
+ (0, import_react4.createElement)(import_dsh_client_ui_primitives3.Button, {
6089
+ variant: "primary",
6090
+ size: "md",
6091
+ disabled: projectBusy || projectDraft === null,
6092
+ onClick: () => {
6093
+ void applyProject();
6094
+ }
6095
+ }, "\u786E\u8BA4\u5199\u5165\u9879\u76EE")
6096
+ ),
6097
+ projectDraft !== null ? (0, import_react4.createElement)("p", { style: styles.muted }, `\u5C06\u521B\u5EFA\uFF1A${projectDraft.files_to_create.join("\u3001")}\uFF0C\u5E76\u66F4\u65B0 .dsh/meta.json`) : null
6098
+ ) : null,
6099
+ projectInitMsg ? (0, import_react4.createElement)("p", { role: "status", style: styles.status }, projectInitMsg) : null
5892
6100
  ),
5893
6101
  (0, import_react4.createElement)(
5894
6102
  "div",