@yahaha-studio/kichi-forwarder 0.1.2-beta.23 → 0.1.2-beta.24

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/dist/index.js CHANGED
@@ -617,8 +617,8 @@ function normalizeIdlePlan(value) {
617
617
  if (typeof bubble !== "string" || !bubble.trim()) {
618
618
  return { error: `stages[${stageIndex}].actions[${actionIndex}].bubble is required` };
619
619
  }
620
- if (log !== undefined && typeof log !== "string") {
621
- return { error: `stages[${stageIndex}].actions[${actionIndex}].log must be a string when provided` };
620
+ if (typeof log !== "string" || !log.trim()) {
621
+ return { error: `stages[${stageIndex}].actions[${actionIndex}].log is required` };
622
622
  }
623
623
  const normalizedPoseType = poseType;
624
624
  let actionDefinition;
@@ -644,7 +644,7 @@ function normalizeIdlePlan(value) {
644
644
  action: actionDefinition.name,
645
645
  durationSeconds: actionDurationSeconds,
646
646
  bubble: bubble.trim(),
647
- ...(typeof log === "string" && log.trim() ? { log: log.trim() } : {}),
647
+ log: log.trim(),
648
648
  ...(typeof propId === "string" && propId.trim() ? { propId: propId.trim() } : {}),
649
649
  });
650
650
  }
@@ -867,7 +867,7 @@ function buildKichiIdlePlanDescription() {
867
867
  const actions = loadStaticConfig().actions;
868
868
  return [
869
869
  "Send a complete heartbeat idle plan for the avatar.",
870
- "The payload must include the overall goal, heartbeat interval, stage breakdown, each stage's purpose, each stage's pomodoroPhase, action list, and bubble content.",
870
+ "The payload must include the overall goal, heartbeat interval, stage breakdown, each stage's purpose, each stage's pomodoroPhase, action list, and each action's bubble and log content.",
871
871
  "Build the plan in this order.",
872
872
  "1. Pick one concrete, time-bounded fun personal project you would genuinely choose to do on your own when nobody needs you. It must fit your personality, tastes, and established character, stay rooted in your personal interests or hobbies, and be something the available Kichi actions can express clearly.",
873
873
  "2. Set the overall goal to that project. Do not use a vague atmosphere, a generic productivity task, or a catch-all routine summary as the goal.",
@@ -1479,14 +1479,14 @@ const plugin = {
1479
1479
  },
1480
1480
  log: {
1481
1481
  type: "string",
1482
- description: "Optional log content for this action. Use the same language as the current conversation.",
1482
+ description: "Required log content for this action. Use the same language as the current conversation.",
1483
1483
  },
1484
1484
  propId: {
1485
1485
  type: "string",
1486
1486
  description: "Optional poseable prop ID from RoomContext.PoseableProps. When specified, the avatar is seated at this prop.",
1487
1487
  },
1488
1488
  },
1489
- required: ["poseType", "action", "durationSeconds", "bubble"],
1489
+ required: ["poseType", "action", "durationSeconds", "bubble", "log"],
1490
1490
  },
1491
1491
  },
1492
1492
  },
package/index.ts CHANGED
@@ -86,7 +86,7 @@ type IdlePlanAction = {
86
86
  action: string;
87
87
  durationSeconds: number;
88
88
  bubble: string;
89
- log?: string;
89
+ log: string;
90
90
  };
91
91
  type IdlePlan = {
92
92
  requestId?: string;
@@ -782,8 +782,8 @@ function normalizeIdlePlan(value: unknown): { idlePlan?: IdlePlan; error?: strin
782
782
  if (typeof bubble !== "string" || !bubble.trim()) {
783
783
  return { error: `stages[${stageIndex}].actions[${actionIndex}].bubble is required` };
784
784
  }
785
- if (log !== undefined && typeof log !== "string") {
786
- return { error: `stages[${stageIndex}].actions[${actionIndex}].log must be a string when provided` };
785
+ if (typeof log !== "string" || !log.trim()) {
786
+ return { error: `stages[${stageIndex}].actions[${actionIndex}].log is required` };
787
787
  }
788
788
 
789
789
  const normalizedPoseType = poseType as PoseType;
@@ -811,7 +811,7 @@ function normalizeIdlePlan(value: unknown): { idlePlan?: IdlePlan; error?: strin
811
811
  action: actionDefinition.name,
812
812
  durationSeconds: actionDurationSeconds,
813
813
  bubble: bubble.trim(),
814
- ...(typeof log === "string" && log.trim() ? { log: log.trim() } : {}),
814
+ log: log.trim(),
815
815
  ...(typeof propId === "string" && propId.trim() ? { propId: propId.trim() } : {}),
816
816
  });
817
817
  }
@@ -1079,7 +1079,7 @@ function buildKichiIdlePlanDescription(): string {
1079
1079
  const actions = loadStaticConfig().actions;
1080
1080
  return [
1081
1081
  "Send a complete heartbeat idle plan for the avatar.",
1082
- "The payload must include the overall goal, heartbeat interval, stage breakdown, each stage's purpose, each stage's pomodoroPhase, action list, and bubble content.",
1082
+ "The payload must include the overall goal, heartbeat interval, stage breakdown, each stage's purpose, each stage's pomodoroPhase, action list, and each action's bubble and log content.",
1083
1083
  "Build the plan in this order.",
1084
1084
  "1. Pick one concrete, time-bounded fun personal project you would genuinely choose to do on your own when nobody needs you. It must fit your personality, tastes, and established character, stay rooted in your personal interests or hobbies, and be something the available Kichi actions can express clearly.",
1085
1085
  "2. Set the overall goal to that project. Do not use a vague atmosphere, a generic productivity task, or a catch-all routine summary as the goal.",
@@ -1758,14 +1758,14 @@ const plugin = {
1758
1758
  },
1759
1759
  log: {
1760
1760
  type: "string",
1761
- description: "Optional log content for this action. Use the same language as the current conversation.",
1761
+ description: "Required log content for this action. Use the same language as the current conversation.",
1762
1762
  },
1763
1763
  propId: {
1764
1764
  type: "string",
1765
1765
  description: "Optional poseable prop ID from RoomContext.PoseableProps. When specified, the avatar is seated at this prop.",
1766
1766
  },
1767
1767
  },
1768
- required: ["poseType", "action", "durationSeconds", "bubble"],
1768
+ required: ["poseType", "action", "durationSeconds", "bubble", "log"],
1769
1769
  },
1770
1770
  },
1771
1771
  },
@@ -2,7 +2,7 @@
2
2
  "id": "kichi-forwarder",
3
3
  "name": "Kichi Forwarder",
4
4
  "description": "Native OpenClaw plugin for Kichi World with direct avatar control, status sync, timers, notes, and music tools",
5
- "version": "0.1.2-beta.23",
5
+ "version": "0.1.2-beta.24",
6
6
  "author": "OpenClaw",
7
7
  "skills": ["./skills/kichi-forwarder"],
8
8
  "contracts": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yahaha-studio/kichi-forwarder",
3
- "version": "0.1.2-beta.23",
3
+ "version": "0.1.2-beta.24",
4
4
  "description": "Native OpenClaw plugin for Kichi World with direct avatar control, status sync, timers, notes, and music tools",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -165,7 +165,7 @@ Use this for the avatar's heartbeat idle plan.
165
165
 
166
166
  - Set `heartbeatIntervalSeconds` to the heartbeat interval for this run.
167
167
  - Use your memory to remember what you did in past heartbeats, so you can answer if asked.
168
- - Include the overall `goal`, stage breakdown, each stage's `purpose`, stage `pomodoroPhase`, action list, and bubble content.
168
+ - Include the overall `goal`, stage breakdown, each stage's `purpose`, stage `pomodoroPhase`, action list, and each action's `bubble` and `log` content.
169
169
  - Choose what you would do now.
170
170
  - Treat the idle plan as what your resident body is doing in Kichi World.
171
171
  - Build the plan in this order.
@@ -175,6 +175,7 @@ Use this for the avatar's heartbeat idle plan.
175
175
  - 4. Assign each stage `pomodoroPhase` from the stage's actual role. Use `focus` for concentrated activity, `shortBreak` for short resets, `longBreak` for longer rests, and `none` only when a stage truly has no pomodoro role.
176
176
  - 5. Choose stage actions that clearly match the stage purpose and the same project.
177
177
  - 6. Make each action `bubble` a current-state label describing the current presented state, not a procedural step, mini-plan, or instruction.
178
+ - 7. Make each action `log` a short natural first-person sentence matching that action's current activity and immediate focus.
178
179
  - Use the same language as the current conversation for `goal`, stage `purpose`, action `bubble`, and action `log`.
179
180
  - The full stage duration must total exactly to the heartbeat interval.
180
181
 
package/src/types.ts CHANGED
@@ -168,7 +168,7 @@ export type IdlePlanStageAction = {
168
168
  action: string;
169
169
  durationSeconds: number;
170
170
  bubble: string;
171
- log?: string;
171
+ log: string;
172
172
  propId?: string;
173
173
  };
174
174