@akemi-mio/creativity 0.1.1 → 0.3.0

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.
@@ -1,4 +1,5 @@
1
1
  import type { Hypothesis, ConceptCombo, CreativitySource, ExternalSignal } from './types';
2
+ import type { FeedbackPromptBlock } from './FeedbackLearning';
2
3
  /**
3
4
  * HypothesisGenerator — 将概念组合转化为可验证的假设
4
5
  *
@@ -19,6 +20,7 @@ export declare class HypothesisGenerator {
19
20
  timeoutMs?: number;
20
21
  requestId?: string;
21
22
  maxTokens?: number;
23
+ responseFormat?: 'object' | 'array';
22
24
  }) => Promise<{
23
25
  data?: any;
24
26
  error?: string;
@@ -38,7 +40,9 @@ export declare class HypothesisGenerator {
38
40
  /** 外部信号 — 不参与配对,作为审视视角注入 LLM */
39
41
  externalSignals?: ExternalSignal[],
40
42
  /** 显式技法;缺省走五技法轮换(rotationSeed + 调用次数) */
41
- method?: string): Promise<Hypothesis[]>;
43
+ method?: string,
44
+ /** 正向反馈闭环 P2:不可变快照的结构化提示块。缺省 = 提示词逐字节不变。 */
45
+ feedback?: FeedbackPromptBlock): Promise<Hypothesis[]>;
42
46
  /**
43
47
  * 调 LLM 生成创意
44
48
  */
@@ -42,13 +42,15 @@ class HypothesisGenerator {
42
42
  /** 外部信号 — 不参与配对,作为审视视角注入 LLM */
43
43
  externalSignals = [],
44
44
  /** 显式技法;缺省走五技法轮换(rotationSeed + 调用次数) */
45
- method) {
45
+ method,
46
+ /** 正向反馈闭环 P2:不可变快照的结构化提示块。缺省 = 提示词逐字节不变。 */
47
+ feedback) {
46
48
  if (combos.length === 0)
47
49
  return [];
48
50
  const technique = method ?? (0, CreativityPrompt_1.pickTechnique)(this.rotationSeed + this.callCount);
49
51
  this.callCount += 1;
50
52
  // 第一级:远程 LLM 驱动生成
51
- const llmResults = await this.tryLLM(sources, combos, dreamMode, externalSignals, technique);
53
+ const llmResults = await this.tryLLM(sources, combos, dreamMode, externalSignals, technique, feedback);
52
54
  if (llmResults.length > 0) {
53
55
  return this.tag(llmResults.map((r) => ({
54
56
  id: `hyp_${Date.now()}_${++this.idCounter}_${this.rng().toString(36).slice(2, 4)}`,
@@ -68,7 +70,7 @@ class HypothesisGenerator {
68
70
  // 第二级:本地 transformers.js 模型
69
71
  if (this.localModel.isEnabled) {
70
72
  (0, Logger_1.log)('INFO', 'hypothesis_fallback_local', { count: combos.length });
71
- const localResults = await this.tryLocalModel(sources, combos, dreamMode, technique);
73
+ const localResults = await this.tryLocalModel(sources, combos, dreamMode, technique, feedback);
72
74
  if (localResults.length > 0) {
73
75
  return this.tag(localResults.map((r) => ({
74
76
  id: `hyp_local_${Date.now()}_${++this.idCounter}_${this.rng().toString(36).slice(2, 4)}`,
@@ -105,14 +107,14 @@ class HypothesisGenerator {
105
107
  /**
106
108
  * 调 LLM 生成创意
107
109
  */
108
- async tryLLM(sources, combos, dreamMode, externalSignals = [], technique = '') {
110
+ async tryLLM(sources, combos, dreamMode, externalSignals = [], technique = '', feedback) {
109
111
  // 限制输入量,避免超 token
110
112
  const topCombos = combos.slice(0, dreamMode ? 5 : 3);
111
113
  const comboInfo = topCombos.map((c) => ({
112
114
  sources: c.sources,
113
115
  description: c.description,
114
116
  }));
115
- const prompt = (0, CreativityPrompt_1.buildCreativityPrompt)(sources, comboInfo, externalSignals);
117
+ const prompt = (0, CreativityPrompt_1.buildCreativityPrompt)(sources, comboInfo, externalSignals, feedback);
116
118
  try {
117
119
  const result = await this.chatJson(prompt, {
118
120
  system: (0, CreativityPrompt_1.buildSystemPrompt)(technique),
@@ -120,6 +122,12 @@ class HypothesisGenerator {
120
122
  timeoutMs: 60000,
121
123
  // 输出无界会顶满超时(M2):生成上限 1200 tokens
122
124
  maxTokens: 1200,
125
+ // 提示词要求顶层数组:json_object 模式下部分模型会包成
126
+ // {"ideas": [...]},Array.isArray 判空后**静默**降级到模板
127
+ // (无 provenance.sources → 反馈事件不可归因,attribution
128
+ // coverage 恒 0)。声明 array 身份让 llm-client 省略
129
+ // response_format,与 InsightGenerator 同策略。
130
+ responseFormat: 'array',
123
131
  });
124
132
  if (result.error) {
125
133
  (0, Logger_1.log)('WARN', 'hypothesis_llm_error', { error: result.error });
@@ -141,13 +149,13 @@ class HypothesisGenerator {
141
149
  /**
142
150
  * 调本地 transformers.js 模型生成创意
143
151
  */
144
- async tryLocalModel(sources, combos, dreamMode, technique = '') {
152
+ async tryLocalModel(sources, combos, dreamMode, technique = '', feedback) {
145
153
  const topCombos = combos.slice(0, dreamMode ? 3 : 2);
146
154
  const comboInfo = topCombos.map((c) => ({
147
155
  sources: c.sources,
148
156
  description: c.description,
149
157
  }));
150
- const prompt = (0, CreativityPrompt_1.buildCreativityPrompt)(sources, comboInfo);
158
+ const prompt = (0, CreativityPrompt_1.buildCreativityPrompt)(sources, comboInfo, [], feedback);
151
159
  const result = await this.localModel.generate(prompt, {
152
160
  system: (0, CreativityPrompt_1.buildSystemPrompt)(technique),
153
161
  temperature: dreamMode ? 0.8 : 0.6,
@@ -1,4 +1,6 @@
1
1
  import type { CreativitySource, ConceptCombo, Hypothesis, CreativeIdea, Strategy, ExternalSignal } from './types';
2
+ import { type FeedbackMixerInput } from './ConceptMixer';
3
+ import type { FeedbackPromptBlock } from './FeedbackLearning';
2
4
  /**
3
5
  * IdeaGenerator — 创造力引擎的核心编排器
4
6
  *
@@ -29,7 +31,11 @@ export declare class IdeaGenerator {
29
31
  * 完整一轮"灵感涌现"流程
30
32
  * @param strategy 生成策略,约束 ConceptMixer 配对空间
31
33
  */
32
- generateIdeas(sources: CreativitySource[], maxIdeas?: number, strategy?: Strategy, externalSignals?: ExternalSignal[], method?: string): Promise<CreativeIdea[]>;
34
+ generateIdeas(sources: CreativitySource[], maxIdeas?: number, strategy?: Strategy, externalSignals?: ExternalSignal[], method?: string,
35
+ /** 正向反馈闭环 P2:结构化提示块(缺省 = 提示词逐字节不变)。 */
36
+ feedbackPrompt?: FeedbackPromptBlock,
37
+ /** 正向反馈闭环 P2:mixer 有界修正 + 探索预算(缺省 = 配对排序逐字节不变)。 */
38
+ mixerFeedback?: FeedbackMixerInput): Promise<CreativeIdea[]>;
33
39
  /**
34
40
  * Dream Mode — 高随机性、跨时间跨度的"梦境"模式
35
41
  */
@@ -34,18 +34,22 @@ class IdeaGenerator {
34
34
  * 完整一轮"灵感涌现"流程
35
35
  * @param strategy 生成策略,约束 ConceptMixer 配对空间
36
36
  */
37
- async generateIdeas(sources, maxIdeas = 5, strategy = 'explore', externalSignals = [], method) {
37
+ async generateIdeas(sources, maxIdeas = 5, strategy = 'explore', externalSignals = [], method,
38
+ /** 正向反馈闭环 P2:结构化提示块(缺省 = 提示词逐字节不变)。 */
39
+ feedbackPrompt,
40
+ /** 正向反馈闭环 P2:mixer 有界修正 + 探索预算(缺省 = 配对排序逐字节不变)。 */
41
+ mixerFeedback) {
38
42
  if (sources.length < 2)
39
43
  return [];
40
44
  // 1. 随机扰动:温度越高,来源选择越随机
41
45
  const activeSources = this.applyTemperature(sources);
42
- // 2. 概念重组:按策略约束配对 + 打分
43
- const scoredCombos = this.mixer.mix(activeSources, maxIdeas * 3, this.exploredPairs, strategy);
46
+ // 2. 概念重组:按策略约束配对 + 打分(可选反馈有界修正)
47
+ const scoredCombos = this.mixer.mix(activeSources, maxIdeas * 3, this.exploredPairs, strategy, mixerFeedback);
44
48
  const combos = scoredCombos.map((c) => c.combo);
45
49
  if (combos.length === 0)
46
50
  return [];
47
51
  // 3. 用 LLM 生成假设(外部信号作为审视视角注入,不参与配对)
48
- const hypotheses = await this.hypothesisGen.generate(combos, activeSources, false, externalSignals, method);
52
+ const hypotheses = await this.hypothesisGen.generate(combos, activeSources, false, externalSignals, method, feedbackPrompt);
49
53
  // 4. 可行性/质量门禁(与 dream 模式同一套门槛)——此前只有梦境路径
50
54
  // 过 feasibilityGate,主路径仅按 novelty 筛,可行性 0 分也能入库。
51
55
  const feasible = this.feasibilityGate(hypotheses);
@@ -78,5 +78,5 @@ export declare function runInsightSamplingExperiment(experimentId: string, obser
78
78
  repeats?: number;
79
79
  }): CapabilityDeltaReport;
80
80
  /** 把 CapabilityDelta 报告转成 ExperimentRun 列表(供 ExperimentRunStore.checkPromotionGate 使用) */
81
- export declare function reportToExperimentRuns(report: CapabilityDeltaReport): ExperimentRun[];
81
+ export declare function reportToExperimentRuns(report: CapabilityDeltaReport, feedbackSnapshotVersion?: string): ExperimentRun[];
82
82
  export {};
@@ -283,12 +283,13 @@ function runInsightSamplingExperiment(experimentId, observations, options) {
283
283
  };
284
284
  }
285
285
  /** 把 CapabilityDelta 报告转成 ExperimentRun 列表(供 ExperimentRunStore.checkPromotionGate 使用) */
286
- function reportToExperimentRuns(report) {
286
+ function reportToExperimentRuns(report, feedbackSnapshotVersion) {
287
287
  return report.variants.map((v) => ({
288
288
  id: `${report.experimentId}:${v.variant}`,
289
289
  hypothesisId: report.hypothesisId,
290
290
  candidateId: v.variant,
291
291
  baselineId: report.baselineVariant,
292
+ ...(feedbackSnapshotVersion ? { feedbackSnapshotVersion } : {}),
292
293
  assignment: (v.variant === 'baseline'
293
294
  ? 'baseline'
294
295
  : v.variant.startsWith('ablation')
@@ -0,0 +1,32 @@
1
+ /**
2
+ * JsonlFeedbackEventStore — CLI/MCP 侧证据事件追加存储(P0)
3
+ *
4
+ * 落盘:`<dataDir>/feedback-events.jsonl`(append-only)。
5
+ * 幂等:加载时建 idempotencyKey 集合,同键追加直接跳过(不抛错、不重复生效)。
6
+ * 这是交换/重放格式,不是权威真相源——主进程 ingest 单向导入 SQLite。
7
+ */
8
+ import { type HypothesisFeedbackEvent, type HypothesisFeedbackEventInput, type NormalizeQuarantineReason } from './FeedbackEvents';
9
+ export interface JsonlAppendResult {
10
+ /** 事件已追加并生效 */
11
+ appended: boolean;
12
+ /** 因 idempotencyKey 已存在而跳过 */
13
+ deduped: boolean;
14
+ event?: HypothesisFeedbackEvent;
15
+ /** 规范化失败(进隔离队列由调用方处理) */
16
+ quarantine?: {
17
+ reason: NormalizeQuarantineReason;
18
+ raw: unknown;
19
+ };
20
+ }
21
+ export declare class JsonlFeedbackEventStore {
22
+ readonly eventsPath: string;
23
+ private seenKeys;
24
+ constructor(dataDir: string);
25
+ /** 重读文件(长活 MCP 进程需看到外部追加;幂等键集合整体重建,成本可接受)。 */
26
+ private ensureLoaded;
27
+ /** 供长活进程在外部写入后强制重读。 */
28
+ invalidate(): void;
29
+ append(input: HypothesisFeedbackEventInput, now?: number): JsonlAppendResult;
30
+ /** 读取全部可解析事件(损坏行跳过,供 ingest/回放使用)。 */
31
+ list(): HypothesisFeedbackEvent[];
32
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * JsonlFeedbackEventStore — CLI/MCP 侧证据事件追加存储(P0)
4
+ *
5
+ * 落盘:`<dataDir>/feedback-events.jsonl`(append-only)。
6
+ * 幂等:加载时建 idempotencyKey 集合,同键追加直接跳过(不抛错、不重复生效)。
7
+ * 这是交换/重放格式,不是权威真相源——主进程 ingest 单向导入 SQLite。
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.JsonlFeedbackEventStore = void 0;
11
+ const fs_1 = require("fs");
12
+ const path_1 = require("path");
13
+ const FeedbackEvents_1 = require("./FeedbackEvents");
14
+ class JsonlFeedbackEventStore {
15
+ eventsPath;
16
+ seenKeys = null;
17
+ constructor(dataDir) {
18
+ this.eventsPath = (0, path_1.join)(dataDir, 'feedback-events.jsonl');
19
+ }
20
+ /** 重读文件(长活 MCP 进程需看到外部追加;幂等键集合整体重建,成本可接受)。 */
21
+ ensureLoaded() {
22
+ if (this.seenKeys)
23
+ return this.seenKeys;
24
+ this.seenKeys = new Set();
25
+ if ((0, fs_1.existsSync)(this.eventsPath)) {
26
+ const lines = (0, fs_1.readFileSync)(this.eventsPath, 'utf-8').split('\n').filter(Boolean);
27
+ for (const line of lines) {
28
+ try {
29
+ const row = JSON.parse(line);
30
+ if (row && typeof row.idempotencyKey === 'string')
31
+ this.seenKeys.add(row.idempotencyKey);
32
+ }
33
+ catch {
34
+ // 损坏行不参与幂等集合;ingest 时会进隔离
35
+ }
36
+ }
37
+ }
38
+ return this.seenKeys;
39
+ }
40
+ /** 供长活进程在外部写入后强制重读。 */
41
+ invalidate() {
42
+ this.seenKeys = null;
43
+ }
44
+ append(input, now = Date.now()) {
45
+ const normalized = (0, FeedbackEvents_1.normalizeFeedbackEvent)(input, now);
46
+ if (!normalized.ok) {
47
+ return { appended: false, deduped: false, quarantine: { reason: normalized.reason, raw: normalized.raw } };
48
+ }
49
+ const event = normalized.event;
50
+ const keys = this.ensureLoaded();
51
+ if (keys.has(event.idempotencyKey)) {
52
+ return { appended: false, deduped: true, event };
53
+ }
54
+ const dir = (0, path_1.dirname)(this.eventsPath);
55
+ if (!(0, fs_1.existsSync)(dir))
56
+ (0, fs_1.mkdirSync)(dir, { recursive: true });
57
+ (0, fs_1.appendFileSync)(this.eventsPath, JSON.stringify(event) + '\n', 'utf-8');
58
+ keys.add(event.idempotencyKey);
59
+ return { appended: true, deduped: false, event };
60
+ }
61
+ /** 读取全部可解析事件(损坏行跳过,供 ingest/回放使用)。 */
62
+ list() {
63
+ if (!(0, fs_1.existsSync)(this.eventsPath))
64
+ return [];
65
+ const out = [];
66
+ for (const line of (0, fs_1.readFileSync)(this.eventsPath, 'utf-8').split('\n')) {
67
+ if (!line.trim())
68
+ continue;
69
+ try {
70
+ out.push(JSON.parse(line));
71
+ }
72
+ catch {
73
+ // skip corrupt
74
+ }
75
+ }
76
+ return out;
77
+ }
78
+ }
79
+ exports.JsonlFeedbackEventStore = JsonlFeedbackEventStore;
@@ -0,0 +1,32 @@
1
+ /**
2
+ * ingestFeedbackEvents — CLI JSONL → 主进程 SQLite 单向导入(P0)
3
+ *
4
+ * 方向固定:CLI/MCP 只追加 feedback-events.jsonl;主进程定期/按需 ingest。
5
+ * 不做反向同步(spec §九 R3:同步验证前禁止双端各自算权重)。
6
+ * 幂等:靠 idempotency_key 唯一约束,重复导入不增样本。
7
+ * 隔离:规范化失败或 hypothesisId 无对应假设的事件进 quarantine 返回值,不入库、不丢弃。
8
+ */
9
+ import { type NormalizeQuarantineReason } from './FeedbackEvents';
10
+ import type { DrizzleFeedbackEventStore } from './DrizzleFeedbackEventStore';
11
+ import type { JsonlFeedbackEventStore } from './JsonlFeedbackEventStore';
12
+ export interface IngestFeedbackResult {
13
+ /** 成功写入权威侧的事件数 */
14
+ ingested: number;
15
+ /** 因 idempotencyKey 已存在而跳过 */
16
+ deduped: number;
17
+ /** 规范化失败或假设不存在 */
18
+ quarantined: Array<{
19
+ reason: NormalizeQuarantineReason | 'unknown_hypothesis';
20
+ raw: unknown;
21
+ }>;
22
+ }
23
+ export interface IngestFeedbackOptions {
24
+ /** 校验 hypothesisId 是否指向真实假设;返回 false 的事件进隔离。 */
25
+ hypothesisExists?: (id: string) => boolean;
26
+ now?: number;
27
+ }
28
+ /**
29
+ * @param jsonlSource CLI 侧 JSONL store(或等价的 list() 数据源)
30
+ * @param target 主进程权威 SQLite store
31
+ */
32
+ export declare function ingestFeedbackEvents(jsonlSource: Pick<JsonlFeedbackEventStore, 'list'>, target: Pick<DrizzleFeedbackEventStore, 'append' | 'hasKey'>, options?: IngestFeedbackOptions): IngestFeedbackResult;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ /**
3
+ * ingestFeedbackEvents — CLI JSONL → 主进程 SQLite 单向导入(P0)
4
+ *
5
+ * 方向固定:CLI/MCP 只追加 feedback-events.jsonl;主进程定期/按需 ingest。
6
+ * 不做反向同步(spec §九 R3:同步验证前禁止双端各自算权重)。
7
+ * 幂等:靠 idempotency_key 唯一约束,重复导入不增样本。
8
+ * 隔离:规范化失败或 hypothesisId 无对应假设的事件进 quarantine 返回值,不入库、不丢弃。
9
+ */
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.ingestFeedbackEvents = ingestFeedbackEvents;
12
+ const FeedbackEvents_1 = require("./FeedbackEvents");
13
+ /**
14
+ * @param jsonlSource CLI 侧 JSONL store(或等价的 list() 数据源)
15
+ * @param target 主进程权威 SQLite store
16
+ */
17
+ function ingestFeedbackEvents(jsonlSource, target, options = {}) {
18
+ const now = options.now ?? Date.now();
19
+ const result = { ingested: 0, deduped: 0, quarantined: [] };
20
+ for (const raw of jsonlSource.list()) {
21
+ const normalized = (0, FeedbackEvents_1.normalizeFeedbackEvent)(raw, now);
22
+ if (!normalized.ok) {
23
+ result.quarantined.push({ reason: normalized.reason, raw });
24
+ continue;
25
+ }
26
+ const event = normalized.event;
27
+ if (options.hypothesisExists && !options.hypothesisExists(event.hypothesisId)) {
28
+ result.quarantined.push({ reason: 'unknown_hypothesis', raw });
29
+ continue;
30
+ }
31
+ if (target.hasKey(event.idempotencyKey)) {
32
+ result.deduped++;
33
+ continue;
34
+ }
35
+ const appendResult = target.append(event);
36
+ if (appendResult.appended)
37
+ result.ingested++;
38
+ else if (appendResult.deduped)
39
+ result.deduped++;
40
+ }
41
+ return result;
42
+ }
package/dist/types.d.ts CHANGED
@@ -5,6 +5,17 @@
5
5
  * - signal: 强制注入 trend/ provocation/insight 来源,限�?randomness
6
6
  */
7
7
  export type Strategy = 'stable' | 'explore' | 'signal';
8
+ /**
9
+ * 规范化概念身份(正向反馈闭环 spec §五.2):稳定字段 `origin` 优先,
10
+ * `name` 仅作展示,缺失时回退 `name:<name>` 以避免与 origin 碰撞。
11
+ * ConceptMixer 与 FeedbackLearning 共用此规则,防止双套身份漂移(R2)。
12
+ */
13
+ export declare function sourceConceptId(s: {
14
+ name: string;
15
+ origin?: string;
16
+ }): string;
17
+ /** 规范化无序概念对键:(A,B) ≡ (B,A)。 */
18
+ export declare function conceptPairKey(a: string, b: string): string;
8
19
  export interface CreativitySource {
9
20
  name: string;
10
21
  content: string;
package/dist/types.js CHANGED
@@ -1,6 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.FERMENT_PHASE_OFFSET_MS = exports.FERMENT_INTERVAL_MS = exports.NORMAL_CYCLE_INTERVAL_MS = exports.DREAM_CYCLE_INTERVAL_MS = exports.CREATIVITY_STORE_VERSION = void 0;
4
+ exports.sourceConceptId = sourceConceptId;
5
+ exports.conceptPairKey = conceptPairKey;
6
+ /**
7
+ * 规范化概念身份(正向反馈闭环 spec §五.2):稳定字段 `origin` 优先,
8
+ * `name` 仅作展示,缺失时回退 `name:<name>` 以避免与 origin 碰撞。
9
+ * ConceptMixer 与 FeedbackLearning 共用此规则,防止双套身份漂移(R2)。
10
+ */
11
+ function sourceConceptId(s) {
12
+ const origin = s.origin ? s.origin.trim() : '';
13
+ return origin || `name:${s.name}`;
14
+ }
15
+ /** 规范化无序概念对键:(A,B) ≡ (B,A)。 */
16
+ function conceptPairKey(a, b) {
17
+ return [a, b].sort().join('|');
18
+ }
4
19
  exports.CREATIVITY_STORE_VERSION = 2;
5
20
  exports.DREAM_CYCLE_INTERVAL_MS = 30 * 60 * 1000; // 30min
6
21
  exports.NORMAL_CYCLE_INTERVAL_MS = 5 * 60 * 1000; // 5min
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@akemi-mio/creativity",
3
- "version": "0.1.1",
3
+ "version": "0.3.0",
4
4
  "description": "Creativity layer: ideas, writing, blog, image, inspiration",
5
5
  "main": "./dist/IdeaGenerator.js",
6
6
  "types": "./dist/IdeaGenerator.d.ts",
@@ -50,6 +50,51 @@
50
50
  "require": "./dist/InsightSamplingExperiment.js",
51
51
  "default": "./dist/InsightSamplingExperiment.js"
52
52
  },
53
+ "./FeedbackEvents": {
54
+ "types": "./dist/FeedbackEvents.d.ts",
55
+ "require": "./dist/FeedbackEvents.js",
56
+ "default": "./dist/FeedbackEvents.js"
57
+ },
58
+ "./JsonlFeedbackEventStore": {
59
+ "types": "./dist/JsonlFeedbackEventStore.d.ts",
60
+ "require": "./dist/JsonlFeedbackEventStore.js",
61
+ "default": "./dist/JsonlFeedbackEventStore.js"
62
+ },
63
+ "./FeedbackLearning": {
64
+ "types": "./dist/FeedbackLearning.d.ts",
65
+ "require": "./dist/FeedbackLearning.js",
66
+ "default": "./dist/FeedbackLearning.js"
67
+ },
68
+ "./CreativityPrompt": {
69
+ "types": "./dist/CreativityPrompt.d.ts",
70
+ "require": "./dist/CreativityPrompt.js",
71
+ "default": "./dist/CreativityPrompt.js"
72
+ },
73
+ "./ConceptMixer": {
74
+ "types": "./dist/ConceptMixer.d.ts",
75
+ "require": "./dist/ConceptMixer.js",
76
+ "default": "./dist/ConceptMixer.js"
77
+ },
78
+ "./FeedbackRuntime": {
79
+ "types": "./dist/FeedbackRuntime.d.ts",
80
+ "require": "./dist/FeedbackRuntime.js",
81
+ "default": "./dist/FeedbackRuntime.js"
82
+ },
83
+ "./FeedbackRollout": {
84
+ "types": "./dist/FeedbackRollout.d.ts",
85
+ "require": "./dist/FeedbackRollout.js",
86
+ "default": "./dist/FeedbackRollout.js"
87
+ },
88
+ "./FeedbackRuntimeRuns": {
89
+ "types": "./dist/FeedbackRuntimeRuns.d.ts",
90
+ "require": "./dist/FeedbackRuntimeRuns.js",
91
+ "default": "./dist/FeedbackRuntimeRuns.js"
92
+ },
93
+ "./FeedbackMetrics": {
94
+ "types": "./dist/FeedbackMetrics.d.ts",
95
+ "require": "./dist/FeedbackMetrics.js",
96
+ "default": "./dist/FeedbackMetrics.js"
97
+ },
53
98
  "./package.json": "./package.json"
54
99
  },
55
100
  "files": [