@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.
@@ -2101,6 +2101,39 @@ ${projectMemoryContext}`);
2101
2101
  parts.push("");
2102
2102
  parts.push(skillsPrompt);
2103
2103
  }
2104
+ const capabilityFeatures = [];
2105
+ const autoSkillNames = Object.entries(resolvedSkills).filter(([, config]) => config.trigger === "auto" || config.trigger === "both").map(([name, config]) => `- **${name}**: ${config.description}`);
2106
+ if (autoSkillNames.length > 0) {
2107
+ capabilityFeatures.push(`### \uB3C4\uAD6C
2108
+ ${autoSkillNames.join("\n")}`);
2109
+ }
2110
+ if (enableChecklist) {
2111
+ 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)");
2112
+ }
2113
+ if (enablePoll) {
2114
+ 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.");
2115
+ }
2116
+ if (capabilityFeatures.length > 0) {
2117
+ parts.push("");
2118
+ parts.push(`## \uB2A5\uB825 \uC18C\uAC1C \uAC00\uC774\uB4DC
2119
+
2120
+ \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,
2121
+ \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.
2122
+
2123
+ ${capabilityFeatures.join("\n\n")}
2124
+
2125
+ **\uC18C\uAC1C \uBC29\uC2DD:**
2126
+ \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.
2127
+ \uC608\uC2DC:
2128
+ "\uC81C\uAC00 \uD560 \uC218 \uC788\uB294 \uAC83\uB4E4\uC744 \uC9C1\uC811 \uBCF4\uC5EC\uB4DC\uB9AC\uACA0\uC2B5\uB2C8\uB2E4!
2129
+
2130
+ <checklist>
2131
+ <step>\uC6F9 \uAC80\uC0C9\uC73C\uB85C \uCD5C\uC2E0 \uB274\uC2A4 \uAC00\uC838\uC624\uAE30</step>
2132
+ <step>\uAC80\uC0C9 \uACB0\uACFC \uAE30\uBC18 \uC694\uC57D \uBCF4\uACE0\uC11C \uC791\uC131</step>
2133
+ </checklist>"
2134
+
2135
+ \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.`);
2136
+ }
2104
2137
  if (enablePoll) {
2105
2138
  parts.push("");
2106
2139
  parts.push(`## \uC120\uD0DD\uC9C0 \uC9C8\uBB38 \uAE30\uB2A5
@@ -2185,7 +2218,7 @@ ${projectMemoryContext}`);
2185
2218
  - \uCCB4\uD06C\uB9AC\uC2A4\uD2B8 \uD0DC\uADF8 \uB4A4\uC5D0 \uCD94\uAC00 \uD14D\uC2A4\uD2B8\uB97C \uC791\uC131\uD558\uC9C0 \uB9C8\uC138\uC694`);
2186
2219
  }
2187
2220
  return parts.length > 0 ? parts.join("\n") : "";
2188
- }, [personalization, globalMemory, useGlobalMemoryEnabled, enablePoll, enableChecklist, buildSkillsPrompt, enableProjects, projectHook.currentProject, projectMemory]);
2221
+ }, [personalization, globalMemory, useGlobalMemoryEnabled, enablePoll, enableChecklist, buildSkillsPrompt, enableProjects, projectHook.currentProject, projectMemory, resolvedSkills]);
2189
2222
  const compressContext = (0, import_react5.useCallback)(async (messagesToCompress, model) => {
2190
2223
  const conversationText = messagesToCompress.map((m) => `${m.role === "user" ? "\uC0AC\uC6A9\uC790" : "AI"}: ${m.content}`).join("\n\n");
2191
2224
  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.
@@ -3190,42 +3223,14 @@ ${result.content}
3190
3223
  if (activeChecklistRef.current) {
3191
3224
  const checklist = activeChecklistRef.current;
3192
3225
  const stepIndex = checklist.currentStep;
3193
- checklist.stepResults.push(accumulatedContent);
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
- const updatedItems = m.checklistBlock.items.map((it, idx) => ({
3202
- ...it,
3203
- status: idx <= stepIndex ? "done" : it.status,
3204
- result: idx === stepIndex ? accumulatedContent : it.result
3205
- }));
3206
- return {
3207
- ...m,
3208
- checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: stepIndex + 1 }
3209
- };
3210
- })
3211
- };
3212
- })
3213
- );
3214
- setSessions(
3215
- (prev) => prev.map((s) => {
3216
- if (s.id !== capturedSessionId) return s;
3217
- return {
3218
- ...s,
3219
- messages: s.messages.map((m) => {
3220
- if (m.id !== assistantMessageId) return m;
3221
- return { ...m, hidden: true };
3222
- })
3223
- };
3224
- })
3225
- );
3226
- const nextStep = stepIndex + 1;
3227
- if (nextStep < checklist.items.length) {
3228
- checklist.currentStep = nextStep;
3226
+ const hasPollTag = /<poll[\s>]/i.test(accumulatedContent);
3227
+ if (hasPollTag && !checklist.waitingForPoll) {
3228
+ checklist.waitingForPoll = true;
3229
+ } else {
3230
+ if (checklist.waitingForPoll) {
3231
+ checklist.waitingForPoll = false;
3232
+ }
3233
+ checklist.stepResults.push(accumulatedContent);
3229
3234
  setSessions(
3230
3235
  (prev) => prev.map((s) => {
3231
3236
  if (s.id !== checklist.sessionId) return s;
@@ -3235,21 +3240,87 @@ ${result.content}
3235
3240
  if (m.id !== checklist.messageId || !m.checklistBlock) return m;
3236
3241
  const updatedItems = m.checklistBlock.items.map((it, idx) => ({
3237
3242
  ...it,
3238
- status: idx === nextStep ? "in_progress" : it.status
3243
+ status: idx <= stepIndex ? "done" : it.status,
3244
+ result: idx === stepIndex ? accumulatedContent : it.result
3239
3245
  }));
3240
3246
  return {
3241
3247
  ...m,
3242
- checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: nextStep }
3248
+ checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: stepIndex + 1 }
3243
3249
  };
3244
3250
  })
3245
3251
  };
3246
3252
  })
3247
3253
  );
3254
+ setSessions(
3255
+ (prev) => prev.map((s) => {
3256
+ if (s.id !== capturedSessionId) return s;
3257
+ return {
3258
+ ...s,
3259
+ messages: s.messages.map((m) => {
3260
+ if (m.id !== assistantMessageId) return m;
3261
+ return { ...m, hidden: true };
3262
+ })
3263
+ };
3264
+ })
3265
+ );
3266
+ const nextStep = stepIndex + 1;
3267
+ if (nextStep < checklist.items.length) {
3268
+ checklist.currentStep = nextStep;
3269
+ setSessions(
3270
+ (prev) => prev.map((s) => {
3271
+ if (s.id !== checklist.sessionId) return s;
3272
+ return {
3273
+ ...s,
3274
+ messages: s.messages.map((m) => {
3275
+ if (m.id !== checklist.messageId || !m.checklistBlock) return m;
3276
+ const updatedItems = m.checklistBlock.items.map((it, idx) => ({
3277
+ ...it,
3278
+ status: idx === nextStep ? "in_progress" : it.status
3279
+ }));
3280
+ return {
3281
+ ...m,
3282
+ checklistBlock: { ...m.checklistBlock, items: updatedItems, currentStep: nextStep }
3283
+ };
3284
+ })
3285
+ };
3286
+ })
3287
+ );
3288
+ skipNextChecklistParsingRef.current = true;
3289
+ setTimeout(() => {
3290
+ sendMessage(
3291
+ `\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 ${nextStep + 1}/${checklist.items.length}\uB2E8\uACC4\uB97C \uC2E4\uD589\uD558\uC138\uC694: "${checklist.items[nextStep].title}".
3292
+ \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.`,
3293
+ { hiddenUserMessage: true }
3294
+ );
3295
+ }, 100);
3296
+ saveMessagesOnEarlyReturn();
3297
+ setIsLoading(false);
3298
+ abortControllerRef.current = null;
3299
+ return;
3300
+ }
3301
+ const stepSummary = checklist.stepResults.map((r, i) => `### ${i + 1}. ${checklist.items[i].title}
3302
+ ${r}`).join("\n\n");
3303
+ setSessions(
3304
+ (prev) => prev.map((s) => {
3305
+ if (s.id !== checklist.sessionId) return s;
3306
+ return {
3307
+ ...s,
3308
+ messages: s.messages.map((m) => {
3309
+ if (m.id !== checklist.messageId || !m.checklistBlock) return m;
3310
+ return { ...m, checklistBlock: { ...m.checklistBlock, completed: true } };
3311
+ })
3312
+ };
3313
+ })
3314
+ );
3315
+ activeChecklistRef.current = null;
3248
3316
  skipNextChecklistParsingRef.current = true;
3249
3317
  setTimeout(() => {
3250
3318
  sendMessage(
3251
- `\uCCB4\uD06C\uB9AC\uC2A4\uD2B8 ${nextStep + 1}/${checklist.items.length}\uB2E8\uACC4\uB97C \uC2E4\uD589\uD558\uC138\uC694: "${checklist.items[nextStep].title}".
3252
- \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.`,
3319
+ `\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:
3320
+
3321
+ ${stepSummary}
3322
+
3323
+ \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.`,
3253
3324
  { hiddenUserMessage: true }
3254
3325
  );
3255
3326
  }, 100);
@@ -3258,36 +3329,6 @@ ${result.content}
3258
3329
  abortControllerRef.current = null;
3259
3330
  return;
3260
3331
  }
3261
- const stepSummary = checklist.stepResults.map((r, i) => `### ${i + 1}. ${checklist.items[i].title}
3262
- ${r}`).join("\n\n");
3263
- setSessions(
3264
- (prev) => prev.map((s) => {
3265
- if (s.id !== checklist.sessionId) return s;
3266
- return {
3267
- ...s,
3268
- messages: s.messages.map((m) => {
3269
- if (m.id !== checklist.messageId || !m.checklistBlock) return m;
3270
- return { ...m, checklistBlock: { ...m.checklistBlock, completed: true } };
3271
- })
3272
- };
3273
- })
3274
- );
3275
- activeChecklistRef.current = null;
3276
- skipNextChecklistParsingRef.current = true;
3277
- setTimeout(() => {
3278
- sendMessage(
3279
- `\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:
3280
-
3281
- ${stepSummary}
3282
-
3283
- \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.`,
3284
- { hiddenUserMessage: true }
3285
- );
3286
- }, 100);
3287
- saveMessagesOnEarlyReturn();
3288
- setIsLoading(false);
3289
- abortControllerRef.current = null;
3290
- return;
3291
3332
  }
3292
3333
  if (!skipNextChecklistParsingRef.current) {
3293
3334
  const { checklistBlock, cleanContent: checklistCleanContent } = parseChecklistFromContent(accumulatedContent);
@@ -3642,6 +3683,32 @@ ${allResults}
3642
3683
  });
3643
3684
  const hasValidResponses = formattedParts.length > 0;
3644
3685
  const isAutoGenerate = responses.every((r) => r.skipped);
3686
+ if (activeChecklistRef.current?.waitingForPoll) {
3687
+ const checklist = activeChecklistRef.current;
3688
+ const stepTitle = checklist.items[checklist.currentStep]?.title || "";
3689
+ setSessions(
3690
+ (prev) => prev.map((s) => {
3691
+ if (s.id !== currentSessionId) return s;
3692
+ return {
3693
+ ...s,
3694
+ messages: s.messages.map((m) => {
3695
+ if (m.id !== messageId) return m;
3696
+ return { ...m, pollBlock: void 0, hidden: true };
3697
+ })
3698
+ };
3699
+ })
3700
+ );
3701
+ skipNextPollParsingRef.current = true;
3702
+ skipNextChecklistParsingRef.current = true;
3703
+ 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:
3704
+ ${formattedParts.join("\n")}
3705
+
3706
+ \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.`;
3707
+ setTimeout(() => {
3708
+ sendMessage(hiddenPrompt2, { hiddenUserMessage: true });
3709
+ }, 100);
3710
+ return;
3711
+ }
3645
3712
  setSessions(
3646
3713
  (prev) => prev.map((s) => {
3647
3714
  if (s.id !== currentSessionId) return s;