@gendive/chatllm 0.17.32 → 0.17.34

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.
@@ -2032,6 +2032,39 @@ ${projectMemoryContext}`);
2032
2032
  parts.push("");
2033
2033
  parts.push(skillsPrompt);
2034
2034
  }
2035
+ const capabilityFeatures = [];
2036
+ const autoSkillNames = Object.entries(resolvedSkills).filter(([, config]) => config.trigger === "auto" || config.trigger === "both").map(([name, config]) => `- **${name}**: ${config.description}`);
2037
+ if (autoSkillNames.length > 0) {
2038
+ capabilityFeatures.push(`### \uB3C4\uAD6C
2039
+ ${autoSkillNames.join("\n")}`);
2040
+ }
2041
+ if (enableChecklist) {
2042
+ capabilityFeatures.push("### \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uC790\uB3D9 \uC2E4\uD589\n\uBCF5\uC7A1\uD55C \uC791\uC5C5\uC744 \uB2E8\uACC4\uBCC4\uB85C \uB098\uB204\uC5B4 \uC790\uB3D9\uC73C\uB85C \uC21C\uCC28 \uC2E4\uD589\uD569\uB2C8\uB2E4. (\uC608: \uB9AC\uC11C\uCE58, \uBE44\uAD50 \uBD84\uC11D, \uBCF4\uACE0\uC11C \uC791\uC131)");
2043
+ }
2044
+ if (enablePoll) {
2045
+ capabilityFeatures.push("### \uC120\uD0DD\uC9C0 \uC9C8\uBB38\n\uD544\uC694\uD55C \uC815\uBCF4\uB97C \uC120\uD0DD\uC9C0\uB85C \uBB3C\uC5B4\uBCF8 \uD6C4 \uB9DE\uCDA4 \uACB0\uACFC\uB97C \uC81C\uACF5\uD569\uB2C8\uB2E4.");
2046
+ }
2047
+ if (capabilityFeatures.length > 0) {
2048
+ parts.push("");
2049
+ parts.push(`## \uB2A5\uB825 \uC18C\uAC1C \uAC00\uC774\uB4DC
2050
+
2051
+ \uC0AC\uC6A9\uC790\uAC00 "\uBB50 \uD560 \uC218 \uC788\uC5B4?", "\uC5B4\uB5A4 \uAE30\uB2A5\uC774 \uC788\uC5B4?", "\uB3C4\uC6C0\uC774 \uD544\uC694\uD574" \uB4F1 \uB2A5\uB825/\uAE30\uB2A5\uC744 \uBB3C\uC5B4\uBCF4\uBA74,
2052
+ \uC544\uB798 \uB0B4\uC6A9\uC744 \uBC14\uD0D5\uC73C\uB85C **\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uD615\uD0DC**\uB85C \uC9C1\uC811 \uC2DC\uC5F0\uD558\uBA70 \uC18C\uAC1C\uD558\uC138\uC694.
2053
+
2054
+ ${capabilityFeatures.join("\n\n")}
2055
+
2056
+ **\uC18C\uAC1C \uBC29\uC2DD:**
2057
+ \uC704 \uAE30\uB2A5 \uC911 \uB300\uD45C\uC801\uC778 \uAC83\uB4E4\uC744 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8\uB85C \uAD6C\uC131\uD558\uC5EC, \uAC01 \uB2E8\uACC4\uC5D0\uC11C \uD574\uB2F9 \uAE30\uB2A5\uC744 \uC2E4\uC81C\uB85C \uC2DC\uC5F0\uD558\uC138\uC694.
2058
+ \uC608\uC2DC:
2059
+ "\uC81C\uAC00 \uD560 \uC218 \uC788\uB294 \uAC83\uB4E4\uC744 \uC9C1\uC811 \uBCF4\uC5EC\uB4DC\uB9AC\uACA0\uC2B5\uB2C8\uB2E4!
2060
+
2061
+ <checklist>
2062
+ <step>\uC6F9 \uAC80\uC0C9\uC73C\uB85C \uCD5C\uC2E0 \uB274\uC2A4 \uAC00\uC838\uC624\uAE30</step>
2063
+ <step>\uAC80\uC0C9 \uACB0\uACFC \uAE30\uBC18 \uC694\uC57D \uBCF4\uACE0\uC11C \uC791\uC131</step>
2064
+ </checklist>"
2065
+
2066
+ \uB2E8, \uB3C4\uAD6C\uAC00 \uC5C6\uB294 \uACBD\uC6B0\uC5D0\uB294 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uC5C6\uC774 \uD14D\uC2A4\uD2B8\uB85C \uAC04\uB2E8\uD788 \uC18C\uAC1C\uD558\uC138\uC694.`);
2067
+ }
2035
2068
  if (enablePoll) {
2036
2069
  parts.push("");
2037
2070
  parts.push(`## \uC120\uD0DD\uC9C0 \uC9C8\uBB38 \uAE30\uB2A5
@@ -2116,7 +2149,7 @@ ${projectMemoryContext}`);
2116
2149
  - \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uD0DC\uADF8 \uB4A4\uC5D0 \uCD94\uAC00 \uD14D\uC2A4\uD2B8\uB97C \uC791\uC131\uD558\uC9C0 \uB9C8\uC138\uC694`);
2117
2150
  }
2118
2151
  return parts.length > 0 ? parts.join("\n") : "";
2119
- }, [personalization, globalMemory, useGlobalMemoryEnabled, enablePoll, enableChecklist, buildSkillsPrompt, enableProjects, projectHook.currentProject, projectMemory]);
2152
+ }, [personalization, globalMemory, useGlobalMemoryEnabled, enablePoll, enableChecklist, buildSkillsPrompt, enableProjects, projectHook.currentProject, projectMemory, resolvedSkills]);
2120
2153
  const compressContext = useCallback5(async (messagesToCompress, model) => {
2121
2154
  const conversationText = messagesToCompress.map((m) => `${m.role === "user" ? "\uC0AC\uC6A9\uC790" : "AI"}: ${m.content}`).join("\n\n");
2122
2155
  const summaryPrompt = `\uB2E4\uC74C \uB300\uD654 \uB0B4\uC6A9\uC744 \uD575\uC2EC \uC815\uBCF4\uB9CC \uC720\uC9C0\uD558\uBA74\uC11C \uAC04\uACB0\uD558\uAC8C \uC694\uC57D\uD574\uC8FC\uC138\uC694.
@@ -3121,42 +3154,14 @@ ${result.content}
3121
3154
  if (activeChecklistRef.current) {
3122
3155
  const checklist = activeChecklistRef.current;
3123
3156
  const stepIndex = checklist.currentStep;
3124
- checklist.stepResults.push(accumulatedContent);
3125
- setSessions(
3126
- (prev) => prev.map((s) => {
3127
- if (s.id !== checklist.sessionId) return s;
3128
- return {
3129
- ...s,
3130
- messages: s.messages.map((m) => {
3131
- if (m.id !== checklist.messageId || !m.checklistBlock) return m;
3132
- const updatedItems = m.checklistBlock.items.map((it, idx) => ({
3133
- ...it,
3134
- status: idx <= stepIndex ? "done" : it.status,
3135
- result: idx === stepIndex ? accumulatedContent : it.result
3136
- }));
3137
- return {
3138
- ...m,
3139
- checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: stepIndex + 1 }
3140
- };
3141
- })
3142
- };
3143
- })
3144
- );
3145
- setSessions(
3146
- (prev) => prev.map((s) => {
3147
- if (s.id !== capturedSessionId) return s;
3148
- return {
3149
- ...s,
3150
- messages: s.messages.map((m) => {
3151
- if (m.id !== assistantMessageId) return m;
3152
- return { ...m, hidden: true };
3153
- })
3154
- };
3155
- })
3156
- );
3157
- const nextStep = stepIndex + 1;
3158
- if (nextStep < checklist.items.length) {
3159
- checklist.currentStep = nextStep;
3157
+ const hasPollTag = /<poll[\s>]/i.test(accumulatedContent);
3158
+ if (hasPollTag && !checklist.waitingForPoll) {
3159
+ checklist.waitingForPoll = true;
3160
+ } else {
3161
+ if (checklist.waitingForPoll) {
3162
+ checklist.waitingForPoll = false;
3163
+ }
3164
+ checklist.stepResults.push(accumulatedContent);
3160
3165
  setSessions(
3161
3166
  (prev) => prev.map((s) => {
3162
3167
  if (s.id !== checklist.sessionId) return s;
@@ -3166,21 +3171,87 @@ ${result.content}
3166
3171
  if (m.id !== checklist.messageId || !m.checklistBlock) return m;
3167
3172
  const updatedItems = m.checklistBlock.items.map((it, idx) => ({
3168
3173
  ...it,
3169
- status: idx === nextStep ? "in_progress" : it.status
3174
+ status: idx <= stepIndex ? "done" : it.status,
3175
+ result: idx === stepIndex ? accumulatedContent : it.result
3170
3176
  }));
3171
3177
  return {
3172
3178
  ...m,
3173
- checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: nextStep }
3179
+ checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: stepIndex + 1 }
3174
3180
  };
3175
3181
  })
3176
3182
  };
3177
3183
  })
3178
3184
  );
3185
+ setSessions(
3186
+ (prev) => prev.map((s) => {
3187
+ if (s.id !== capturedSessionId) return s;
3188
+ return {
3189
+ ...s,
3190
+ messages: s.messages.map((m) => {
3191
+ if (m.id !== assistantMessageId) return m;
3192
+ return { ...m, hidden: true };
3193
+ })
3194
+ };
3195
+ })
3196
+ );
3197
+ const nextStep = stepIndex + 1;
3198
+ if (nextStep < checklist.items.length) {
3199
+ checklist.currentStep = nextStep;
3200
+ setSessions(
3201
+ (prev) => prev.map((s) => {
3202
+ if (s.id !== checklist.sessionId) return s;
3203
+ return {
3204
+ ...s,
3205
+ messages: s.messages.map((m) => {
3206
+ if (m.id !== checklist.messageId || !m.checklistBlock) return m;
3207
+ const updatedItems = m.checklistBlock.items.map((it, idx) => ({
3208
+ ...it,
3209
+ status: idx === nextStep ? "in_progress" : it.status
3210
+ }));
3211
+ return {
3212
+ ...m,
3213
+ checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: nextStep }
3214
+ };
3215
+ })
3216
+ };
3217
+ })
3218
+ );
3219
+ skipNextChecklistParsingRef.current = true;
3220
+ setTimeout(() => {
3221
+ sendMessage(
3222
+ `\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 ${nextStep + 1}/${checklist.items.length}\uB2E8\uACC4\uB97C \uC2E4\uD589\uD558\uC138\uC694: "${checklist.items[nextStep].title}".
3223
+ \uC774\uC804 \uB2E8\uACC4 \uACB0\uACFC\uB97C \uCC38\uACE0\uD558\uB418, \uC774 \uB2E8\uACC4\uC5D0\uB9CC \uC9D1\uC911\uD558\uC5EC \uACB0\uACFC\uB97C \uC791\uC131\uD558\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
3224
+ { hiddenUserMessage: true }
3225
+ );
3226
+ }, 100);
3227
+ saveMessagesOnEarlyReturn();
3228
+ setIsLoading(false);
3229
+ abortControllerRef.current = null;
3230
+ return;
3231
+ }
3232
+ const stepSummary = checklist.stepResults.map((r, i) => `### ${i + 1}. ${checklist.items[i].title}
3233
+ ${r}`).join("\n\n");
3234
+ setSessions(
3235
+ (prev) => prev.map((s) => {
3236
+ if (s.id !== checklist.sessionId) return s;
3237
+ return {
3238
+ ...s,
3239
+ messages: s.messages.map((m) => {
3240
+ if (m.id !== checklist.messageId || !m.checklistBlock) return m;
3241
+ return { ...m, checklistBlock: { ...m.checklistBlock, completed: true } };
3242
+ })
3243
+ };
3244
+ })
3245
+ );
3246
+ activeChecklistRef.current = null;
3179
3247
  skipNextChecklistParsingRef.current = true;
3180
3248
  setTimeout(() => {
3181
3249
  sendMessage(
3182
- `\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 ${nextStep + 1}/${checklist.items.length}\uB2E8\uACC4\uB97C \uC2E4\uD589\uD558\uC138\uC694: "${checklist.items[nextStep].title}".
3183
- \uC774\uC804 \uB2E8\uACC4 \uACB0\uACFC\uB97C \uCC38\uACE0\uD558\uB418, \uC774 \uB2E8\uACC4\uC5D0\uB9CC \uC9D1\uC911\uD558\uC5EC \uACB0\uACFC\uB97C \uC791\uC131\uD558\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
3250
+ `\uBAA8\uB4E0 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB2E8\uACC4\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC544\uB798\uB294 \uAC01 \uB2E8\uACC4\uBCC4 \uACB0\uACFC\uC785\uB2C8\uB2E4:
3251
+
3252
+ ${stepSummary}
3253
+
3254
+ \uC704 \uACB0\uACFC\uB97C \uC885\uD569\uD558\uC5EC \uCD5C\uC885 \uACB0\uACFC\uBB3C\uC744 \uC644\uC131\uD574\uC8FC\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
3184
3255
  { hiddenUserMessage: true }
3185
3256
  );
3186
3257
  }, 100);
@@ -3189,36 +3260,6 @@ ${result.content}
3189
3260
  abortControllerRef.current = null;
3190
3261
  return;
3191
3262
  }
3192
- const stepSummary = checklist.stepResults.map((r, i) => `### ${i + 1}. ${checklist.items[i].title}
3193
- ${r}`).join("\n\n");
3194
- setSessions(
3195
- (prev) => prev.map((s) => {
3196
- if (s.id !== checklist.sessionId) return s;
3197
- return {
3198
- ...s,
3199
- messages: s.messages.map((m) => {
3200
- if (m.id !== checklist.messageId || !m.checklistBlock) return m;
3201
- return { ...m, checklistBlock: { ...m.checklistBlock, completed: true } };
3202
- })
3203
- };
3204
- })
3205
- );
3206
- activeChecklistRef.current = null;
3207
- skipNextChecklistParsingRef.current = true;
3208
- setTimeout(() => {
3209
- sendMessage(
3210
- `\uBAA8\uB4E0 \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB2E8\uACC4\uAC00 \uC644\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4. \uC544\uB798\uB294 \uAC01 \uB2E8\uACC4\uBCC4 \uACB0\uACFC\uC785\uB2C8\uB2E4:
3211
-
3212
- ${stepSummary}
3213
-
3214
- \uC704 \uACB0\uACFC\uB97C \uC885\uD569\uD558\uC5EC \uCD5C\uC885 \uACB0\uACFC\uBB3C\uC744 \uC644\uC131\uD574\uC8FC\uC138\uC694. checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`,
3215
- { hiddenUserMessage: true }
3216
- );
3217
- }, 100);
3218
- saveMessagesOnEarlyReturn();
3219
- setIsLoading(false);
3220
- abortControllerRef.current = null;
3221
- return;
3222
3263
  }
3223
3264
  if (!skipNextChecklistParsingRef.current) {
3224
3265
  const { checklistBlock, cleanContent: checklistCleanContent } = parseChecklistFromContent(accumulatedContent);
@@ -3573,6 +3614,32 @@ ${allResults}
3573
3614
  });
3574
3615
  const hasValidResponses = formattedParts.length > 0;
3575
3616
  const isAutoGenerate = responses.every((r) => r.skipped);
3617
+ if (activeChecklistRef.current?.waitingForPoll) {
3618
+ const checklist = activeChecklistRef.current;
3619
+ const stepTitle = checklist.items[checklist.currentStep]?.title || "";
3620
+ setSessions(
3621
+ (prev) => prev.map((s) => {
3622
+ if (s.id !== currentSessionId) return s;
3623
+ return {
3624
+ ...s,
3625
+ messages: s.messages.map((m) => {
3626
+ if (m.id !== messageId) return m;
3627
+ return { ...m, pollBlock: void 0, hidden: true };
3628
+ })
3629
+ };
3630
+ })
3631
+ );
3632
+ skipNextPollParsingRef.current = true;
3633
+ skipNextChecklistParsingRef.current = true;
3634
+ const hiddenPrompt2 = isAutoGenerate ? `\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB2E8\uACC4 "${stepTitle}"\uC744 \uC2E4\uD589\uD558\uC138\uC694. \uC0AC\uC6A9\uC790\uAC00 \uC790\uB3D9 \uC120\uD0DD\uC744 \uC694\uCCAD\uD588\uC73C\uBBC0\uB85C, \uCD5C\uC801\uC758 \uC635\uC158\uC744 \uC120\uD0DD\uD558\uC5EC \uC774 \uB2E8\uACC4\uB97C \uC644\uB8CC\uD574\uC8FC\uC138\uC694. poll \uD0DC\uADF8\uC640 checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.` : `\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uB2E8\uACC4 "${stepTitle}"\uC744 \uACC4\uC18D\uD569\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uC758 \uC120\uD0DD:
3635
+ ${formattedParts.join("\n")}
3636
+
3637
+ \uC704 \uC120\uD0DD\uC744 \uBC18\uC601\uD558\uC5EC \uC774 \uB2E8\uACC4\uC758 \uACB0\uACFC\uB97C \uC644\uC131\uD574\uC8FC\uC138\uC694. poll \uD0DC\uADF8\uC640 checklist \uD0DC\uADF8\uB294 \uC0AC\uC6A9\uD558\uC9C0 \uB9C8\uC138\uC694.`;
3638
+ setTimeout(() => {
3639
+ sendMessage(hiddenPrompt2, { hiddenUserMessage: true });
3640
+ }, 100);
3641
+ return;
3642
+ }
3576
3643
  setSessions(
3577
3644
  (prev) => prev.map((s) => {
3578
3645
  if (s.id !== currentSessionId) return s;