@clawos-dev/clawd 0.2.454 → 0.2.456

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.
@@ -22062,6 +22062,28 @@ var ChannelDeleteResultSchema = external_exports.object({
22062
22062
 
22063
22063
  // ../protocol/src/topic.ts
22064
22064
  var nonBlank2 = external_exports.string().trim().min(1);
22065
+ var TOPIC_DECISION_TYPES = ["master-confirmed", "owner-needed"];
22066
+ var TOPIC_DECISION_STATUSES = ["open", "resolved"];
22067
+ var TOPIC_DECISION_TYPE_MASTER_CONFIRMED = TOPIC_DECISION_TYPES[0];
22068
+ var TOPIC_DECISION_TYPE_OWNER_NEEDED = TOPIC_DECISION_TYPES[1];
22069
+ var TOPIC_DECISION_STATUS_OPEN = TOPIC_DECISION_STATUSES[0];
22070
+ var TOPIC_DECISION_STATUS_RESOLVED = TOPIC_DECISION_STATUSES[1];
22071
+ var TopicDecisionTypeSchema = external_exports.enum(TOPIC_DECISION_TYPES);
22072
+ var TopicDecisionStatusSchema = external_exports.enum(TOPIC_DECISION_STATUSES);
22073
+ var TopicDecisionSchema = external_exports.object({
22074
+ type: TopicDecisionTypeSchema,
22075
+ status: TopicDecisionStatusSchema,
22076
+ question: nonBlank2,
22077
+ recommendation: nonBlank2
22078
+ }).superRefine((decision, ctx) => {
22079
+ if (decision.type === TOPIC_DECISION_TYPE_MASTER_CONFIRMED && decision.status !== TOPIC_DECISION_STATUS_RESOLVED) {
22080
+ ctx.addIssue({
22081
+ code: external_exports.ZodIssueCode.custom,
22082
+ path: ["status"],
22083
+ message: "master-confirmed decisions must be resolved"
22084
+ });
22085
+ }
22086
+ });
22065
22087
  var TOPIC_STATES = ["planning", "running", "done"];
22066
22088
  var TopicStateSchema = external_exports.enum(TOPIC_STATES);
22067
22089
  var TopicActivityEntrySchema = external_exports.object({
@@ -22071,7 +22093,12 @@ var TopicActivityEntrySchema = external_exports.object({
22071
22093
  target: external_exports.string().optional(),
22072
22094
  reason: external_exports.string().min(1),
22073
22095
  /** 该动作确认的产出物(watcher 返回的 artifacts);影响面视图的唯一数据源 */
22074
- artifacts: external_exports.array(nonBlank2).optional()
22096
+ artifacts: external_exports.array(nonBlank2).optional(),
22097
+ /**
22098
+ * Optional decision projection; legacy activity entries omit this field. `open` means the
22099
+ * owner still needs to answer; `resolved` records the conclusion without deleting the question.
22100
+ */
22101
+ decision: TopicDecisionSchema.optional()
22075
22102
  });
22076
22103
  var TopicLineMetaSchema = external_exports.object({
22077
22104
  rejectCount: external_exports.number().int().min(0),
@@ -22178,7 +22205,8 @@ var TopicAppendArgsSchema = external_exports.object({
22178
22205
  target: nonBlank2.optional(),
22179
22206
  reason: nonBlank2,
22180
22207
  /** 该动作确认的产出物;影响面视图只吃这个字段 */
22181
- artifacts: external_exports.array(nonBlank2).optional()
22208
+ artifacts: external_exports.array(nonBlank2).optional(),
22209
+ decision: TopicActivityEntrySchema.shape.decision
22182
22210
  });
22183
22211
  var TopicRejectArgsSchema = external_exports.object({
22184
22212
  topicId: external_exports.string().min(1),
@@ -23932,7 +23960,7 @@ var METHOD_DOCS = {
23932
23960
  args: TopicSetPlanArgsSchema
23933
23961
  },
23934
23962
  "topic:append": {
23935
- summary: '\u5F80\u8BDD\u9898\u6D41\u6C34\u8FFD\u52A0\u4E00\u6761\uFF1Breason \u5FC5\u586B\uFF08\u8001\u677F\u4E8B\u540E\u770B\u7684\u662F"\u51ED\u4EC0\u4E48\u8FD9\u4E48\u5224\u65AD"\uFF09',
23963
+ summary: "\u5F80\u8BDD\u9898\u6D41\u6C34\u8FFD\u52A0\u4E00\u6761\uFF1Breason \u5FC5\u586B\u3002Master \u505A\u4EE3\u8001\u677F\u786E\u8BA4\u6216\u5347\u7EA7\u8001\u677F\u51B3\u7B56\u65F6\uFF0C\u5FC5\u987B\u9644 decision\uFF08type/status/question/recommendation\uFF09",
23936
23964
  args: TopicAppendArgsSchema
23937
23965
  },
23938
23966
  "topic:reject": {
@@ -24514,11 +24542,13 @@ var ProjectStore = class {
24514
24542
  * spec 2026-06-02 §5.6.3:scaffold 对 assistant 不可见,避免 assistant 被诱导去"读 example
24515
24543
  * 代码再参考"。assistant 进 project 时目录已是完整模板,直接 pnpm install 即可。
24516
24544
  */
24517
- async scaffold(name, templateSrcDir, scaffoldScriptPath) {
24545
+ async scaffold(name, templateSrcDir, scaffoldScriptPath, extraEnv) {
24518
24546
  const destDir = this.projectDir(name);
24519
24547
  return await new Promise((resolve, reject) => {
24520
24548
  const child = (0, import_node_child_process.spawn)("bash", [scaffoldScriptPath, name, templateSrcDir, destDir], {
24521
- env: { ...process.env, PATH: process.env.PATH ?? "" },
24549
+ // extraEnv 排在 PATH **之前**:凭据表里若混进一条名叫 PATH 的条目,顶掉 PATH 会让
24550
+ // 脚本以「命令找不到」的形态崩在离现场很远的地方。
24551
+ env: { ...process.env, ...extraEnv ?? {}, PATH: process.env.PATH ?? "" },
24522
24552
  stdio: ["ignore", "pipe", "pipe"]
24523
24553
  });
24524
24554
  let stdout = "";
@@ -24722,7 +24752,11 @@ async function startPublishJob(deps, args) {
24722
24752
  }
24723
24753
  const child = spawn2("bash", [args.scriptPath, projDir, args.personaRoot ?? ""], {
24724
24754
  cwd: projDir,
24725
- env: process.env,
24755
+ // 宿主给的 env 覆盖在 process.env 之上:daemon 进程本身没有这些变量(它们只在这一个
24756
+ // 子进程里活着)。云上宿主不传 extraEnv,凭据本来就在容器 env 里。
24757
+ // PATH 排在最后(与 ProjectStore.scaffold 同款):extraEnv 里若混进一条名叫 PATH 的条目,
24758
+ // 顶掉 PATH 会让脚本以「命令找不到」的形态崩在离现场很远的地方。
24759
+ env: { ...process.env, ...args.extraEnv ?? {}, PATH: process.env.PATH ?? "" },
24726
24760
  stdio: ["ignore", "pipe", "pipe"]
24727
24761
  });
24728
24762
  const jobId = registry2.create({
@@ -25003,7 +25037,8 @@ function createPublishService() {
25003
25037
  name: args.name,
25004
25038
  sessionId: args.sessionId,
25005
25039
  scriptPath: args.scriptPath,
25006
- personaRoot: args.personaRoot
25040
+ personaRoot: args.personaRoot,
25041
+ ...args.extraEnv ? { extraEnv: args.extraEnv } : {}
25007
25042
  }
25008
25043
  );
25009
25044
  },
@@ -25020,7 +25055,7 @@ async function createProjectOnDisk(args) {
25020
25055
  const { store, name, templateSrcDir, scaffoldScript, logger } = args;
25021
25056
  const project = await store.create(name, args.reservedPorts);
25022
25057
  try {
25023
- const result = await store.scaffold(name, templateSrcDir, scaffoldScript);
25058
+ const result = await store.scaffold(name, templateSrcDir, scaffoldScript, args.extraEnv);
25024
25059
  logger?.info("app-builder.scaffold.done", { name, stdout: result.stdout.slice(0, 200) });
25025
25060
  } catch (err) {
25026
25061
  const message = err instanceof Error ? err.message : String(err);