@molroo-io/sdk 0.8.4 → 0.9.1

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.
Files changed (73) hide show
  1. package/dist/cjs/errors.d.ts +1 -1
  2. package/dist/cjs/errors.d.ts.map +1 -1
  3. package/dist/cjs/errors.js +2 -1
  4. package/dist/cjs/events/types.d.ts +1 -1
  5. package/dist/cjs/events/types.d.ts.map +1 -1
  6. package/dist/cjs/index.d.ts +4 -2
  7. package/dist/cjs/index.d.ts.map +1 -1
  8. package/dist/cjs/index.js +5 -1
  9. package/dist/cjs/llm/resolve.d.ts.map +1 -1
  10. package/dist/cjs/llm/resolve.js +2 -1
  11. package/dist/cjs/llm/schema.d.ts +0 -114
  12. package/dist/cjs/llm/schema.d.ts.map +1 -1
  13. package/dist/cjs/llm/schema.js +1 -44
  14. package/dist/cjs/persona/chat-orchestrator.d.ts +18 -3
  15. package/dist/cjs/persona/chat-orchestrator.d.ts.map +1 -1
  16. package/dist/cjs/persona/chat-orchestrator.js +29 -109
  17. package/dist/cjs/persona/conversation.d.ts +84 -0
  18. package/dist/cjs/persona/conversation.d.ts.map +1 -0
  19. package/dist/cjs/persona/conversation.js +72 -0
  20. package/dist/cjs/persona/memory-pipeline.d.ts.map +1 -1
  21. package/dist/cjs/persona/memory-pipeline.js +30 -4
  22. package/dist/cjs/persona.d.ts +441 -22
  23. package/dist/cjs/persona.d.ts.map +1 -1
  24. package/dist/cjs/persona.js +418 -6
  25. package/dist/cjs/shared/errors.d.ts +32 -2
  26. package/dist/cjs/shared/errors.d.ts.map +1 -1
  27. package/dist/cjs/shared/errors.js +33 -2
  28. package/dist/cjs/types.d.ts +70 -5
  29. package/dist/cjs/types.d.ts.map +1 -1
  30. package/dist/cjs/types.js +2 -1
  31. package/dist/cjs/world/world-persona.d.ts +20 -5
  32. package/dist/cjs/world/world-persona.d.ts.map +1 -1
  33. package/dist/cjs/world/world-persona.js +21 -5
  34. package/dist/cjs/world/world.d.ts +28 -5
  35. package/dist/cjs/world/world.d.ts.map +1 -1
  36. package/dist/cjs/world/world.js +29 -3
  37. package/dist/esm/errors.d.ts +1 -1
  38. package/dist/esm/errors.d.ts.map +1 -1
  39. package/dist/esm/errors.js +1 -1
  40. package/dist/esm/events/types.d.ts +1 -1
  41. package/dist/esm/events/types.d.ts.map +1 -1
  42. package/dist/esm/index.d.ts +4 -2
  43. package/dist/esm/index.d.ts.map +1 -1
  44. package/dist/esm/index.js +3 -1
  45. package/dist/esm/llm/resolve.d.ts.map +1 -1
  46. package/dist/esm/llm/resolve.js +2 -1
  47. package/dist/esm/llm/schema.d.ts +0 -114
  48. package/dist/esm/llm/schema.d.ts.map +1 -1
  49. package/dist/esm/llm/schema.js +0 -43
  50. package/dist/esm/persona/chat-orchestrator.d.ts +18 -3
  51. package/dist/esm/persona/chat-orchestrator.d.ts.map +1 -1
  52. package/dist/esm/persona/chat-orchestrator.js +29 -109
  53. package/dist/esm/persona/conversation.d.ts +84 -0
  54. package/dist/esm/persona/conversation.d.ts.map +1 -0
  55. package/dist/esm/persona/conversation.js +68 -0
  56. package/dist/esm/persona/memory-pipeline.d.ts.map +1 -1
  57. package/dist/esm/persona/memory-pipeline.js +30 -4
  58. package/dist/esm/persona.d.ts +441 -22
  59. package/dist/esm/persona.d.ts.map +1 -1
  60. package/dist/esm/persona.js +418 -7
  61. package/dist/esm/shared/errors.d.ts +32 -2
  62. package/dist/esm/shared/errors.d.ts.map +1 -1
  63. package/dist/esm/shared/errors.js +32 -1
  64. package/dist/esm/types.d.ts +70 -5
  65. package/dist/esm/types.d.ts.map +1 -1
  66. package/dist/esm/types.js +1 -1
  67. package/dist/esm/world/world-persona.d.ts +20 -5
  68. package/dist/esm/world/world-persona.d.ts.map +1 -1
  69. package/dist/esm/world/world-persona.js +21 -5
  70. package/dist/esm/world/world.d.ts +28 -5
  71. package/dist/esm/world/world.d.ts.map +1 -1
  72. package/dist/esm/world/world.js +29 -3
  73. package/package.json +1 -1
@@ -0,0 +1,84 @@
1
+ import type { Message } from '../llm/adapter';
2
+ import type { InterlocutorContext } from '../types';
3
+ import type { MolrooPersona, PersonaChatResult } from '../persona';
4
+ /** Options for creating a {@link Conversation} session. */
5
+ export interface ConversationOptions {
6
+ /** Maximum number of messages to retain in history. Oldest messages are trimmed first. Default: unlimited. */
7
+ maxMessages?: number;
8
+ /** Default source entity for all messages in this conversation. */
9
+ from?: string | InterlocutorContext;
10
+ /** Free-form app-specific context appended to every system prompt in this conversation. */
11
+ consumerSuffix?: string;
12
+ /**
13
+ * Behavioral constraints and absolute rules applied to every message in this conversation.
14
+ * Examples: "Never break character", "Always respond in Korean".
15
+ */
16
+ consumerRules?: string;
17
+ /**
18
+ * Few-shot example messages for style/behavior reference, applied to every message in this conversation.
19
+ * Helps the LLM match a specific tone or response format.
20
+ */
21
+ consumerExamples?: string;
22
+ }
23
+ /**
24
+ * Auto-managed conversation session that tracks message history.
25
+ *
26
+ * Instead of manually passing `history` to every `chat()` call,
27
+ * create a Conversation and use `send()` — history is managed automatically.
28
+ *
29
+ * @example
30
+ * ```typescript
31
+ * const conv = persona.conversation({ maxMessages: 30 });
32
+ *
33
+ * const r1 = await conv.send('Hello!');
34
+ * console.log(r1.text); // persona's response
35
+ *
36
+ * const r2 = await conv.send('Tell me more');
37
+ * // r2 includes full conversation context automatically
38
+ *
39
+ * console.log(conv.messages.length); // 4 (2 user + 2 assistant)
40
+ * conv.clear(); // reset history
41
+ * ```
42
+ */
43
+ export declare class Conversation {
44
+ private _history;
45
+ private readonly _persona;
46
+ private readonly _options;
47
+ constructor(persona: MolrooPersona, options?: ConversationOptions);
48
+ /**
49
+ * Send a message and get a response. History is updated automatically.
50
+ *
51
+ * @param message - User message to send.
52
+ * @param options - Per-message overrides (from, consumerSuffix, onToolCall).
53
+ * @returns Chat result with text, emotion data, and updated history.
54
+ */
55
+ send(message: string, options?: {
56
+ from?: string | InterlocutorContext;
57
+ /** Free-form app-specific context appended to the system prompt for this message only. */
58
+ consumerSuffix?: string;
59
+ /**
60
+ * Behavioral constraints and absolute rules for this message only.
61
+ * Overrides the session-level `consumerRules` when provided.
62
+ */
63
+ consumerRules?: string;
64
+ /**
65
+ * Few-shot example messages for style/behavior reference for this message only.
66
+ * Overrides the session-level `consumerExamples` when provided.
67
+ */
68
+ consumerExamples?: string;
69
+ onToolCall?: (call: {
70
+ name: string;
71
+ args: Record<string, unknown>;
72
+ result: unknown;
73
+ }) => void;
74
+ }): Promise<PersonaChatResult>;
75
+ /** Read-only view of the conversation history. */
76
+ get messages(): readonly Message[];
77
+ /** Number of messages in the conversation. */
78
+ get length(): number;
79
+ /** Clear all conversation history. */
80
+ clear(): void;
81
+ /** Trim history to maxMessages if configured. */
82
+ private trimHistory;
83
+ }
84
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../../src/persona/conversation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEnE,2DAA2D;AAC3D,MAAM,WAAW,mBAAmB;IAClC,8GAA8G;IAC9G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;IACpC,2FAA2F;IAC3F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAiB;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAsB;gBAEnC,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,mBAAmB;IAKjE;;;;;;OAMG;IACG,IAAI,CACR,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,IAAI,CAAC,EAAE,MAAM,GAAG,mBAAmB,CAAC;QACpC,0FAA0F;QAC1F,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB;;;WAGG;QACH,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB;;;WAGG;QACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAAC,MAAM,EAAE,OAAO,CAAA;SAAE,KAAK,IAAI,CAAC;KAC/F,GACA,OAAO,CAAC,iBAAiB,CAAC;IAkB7B,kDAAkD;IAClD,IAAI,QAAQ,IAAI,SAAS,OAAO,EAAE,CAEjC;IAED,8CAA8C;IAC9C,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,sCAAsC;IACtC,KAAK,IAAI,IAAI;IAIb,iDAAiD;IACjD,OAAO,CAAC,WAAW;CAMpB"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Conversation = void 0;
4
+ /**
5
+ * Auto-managed conversation session that tracks message history.
6
+ *
7
+ * Instead of manually passing `history` to every `chat()` call,
8
+ * create a Conversation and use `send()` — history is managed automatically.
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * const conv = persona.conversation({ maxMessages: 30 });
13
+ *
14
+ * const r1 = await conv.send('Hello!');
15
+ * console.log(r1.text); // persona's response
16
+ *
17
+ * const r2 = await conv.send('Tell me more');
18
+ * // r2 includes full conversation context automatically
19
+ *
20
+ * console.log(conv.messages.length); // 4 (2 user + 2 assistant)
21
+ * conv.clear(); // reset history
22
+ * ```
23
+ */
24
+ class Conversation {
25
+ constructor(persona, options) {
26
+ this._history = [];
27
+ this._persona = persona;
28
+ this._options = options ?? {};
29
+ }
30
+ /**
31
+ * Send a message and get a response. History is updated automatically.
32
+ *
33
+ * @param message - User message to send.
34
+ * @param options - Per-message overrides (from, consumerSuffix, onToolCall).
35
+ * @returns Chat result with text, emotion data, and updated history.
36
+ */
37
+ async send(message, options) {
38
+ const result = await this._persona.chat(message, {
39
+ from: options?.from ?? this._options.from,
40
+ consumerSuffix: options?.consumerSuffix ?? this._options.consumerSuffix,
41
+ consumerRules: options?.consumerRules ?? this._options.consumerRules,
42
+ consumerExamples: options?.consumerExamples ?? this._options.consumerExamples,
43
+ history: this._history,
44
+ onToolCall: options?.onToolCall,
45
+ });
46
+ // Append this turn to history
47
+ this._history.push({ role: 'user', content: message });
48
+ this._history.push({ role: 'assistant', content: result.text });
49
+ this.trimHistory();
50
+ return result;
51
+ }
52
+ /** Read-only view of the conversation history. */
53
+ get messages() {
54
+ return this._history;
55
+ }
56
+ /** Number of messages in the conversation. */
57
+ get length() {
58
+ return this._history.length;
59
+ }
60
+ /** Clear all conversation history. */
61
+ clear() {
62
+ this._history = [];
63
+ }
64
+ /** Trim history to maxMessages if configured. */
65
+ trimHistory() {
66
+ if (this._options.maxMessages && this._history.length > this._options.maxMessages) {
67
+ // Trim from the front, keep the most recent messages
68
+ this._history = this._history.slice(-this._options.maxMessages);
69
+ }
70
+ }
71
+ }
72
+ exports.Conversation = Conversation;
@@ -1 +1 @@
1
- {"version":3,"file":"memory-pipeline.d.ts","sourceRoot":"","sources":["../../../src/persona/memory-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,UAAU,CAAC;AAGrE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;CAC9B;AA+CD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAQpF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAehF"}
1
+ {"version":3,"file":"memory-pipeline.d.ts","sourceRoot":"","sources":["../../../src/persona/memory-pipeline.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAc,MAAM,iBAAiB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAyB,MAAM,UAAU,CAAC;AAyBrE,MAAM,WAAW,kBAAkB;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,aAAa,GAAG,IAAI,CAAC;IACpC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,GAAG,EAAE,UAAU,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,UAAU,GAAG,IAAI,CAAC;CAC9B;AAiDD;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAUpF;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAmBhF"}
@@ -3,12 +3,32 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.postPerceive = postPerceive;
4
4
  exports.postChat = postChat;
5
5
  const event_emitter_1 = require("./event-emitter");
6
+ /** Emit pipeline error or log warning if no EventAdapter. */
7
+ function handlePipelineError(deps, stage, error) {
8
+ const message = error instanceof Error ? error.message : String(error);
9
+ if (deps.events) {
10
+ deps.events.emit({
11
+ type: 'pipeline_error',
12
+ personaId: deps.personaId,
13
+ timestamp: Date.now(),
14
+ payload: { stage, error: message },
15
+ }).catch(() => {
16
+ // Last resort: log to console if event emit itself fails
17
+ console.warn(`[molroo-sdk] Pipeline error (${stage}):`, message);
18
+ });
19
+ }
20
+ else {
21
+ console.warn(`[molroo-sdk] Pipeline error (${stage}):`, message);
22
+ }
23
+ }
6
24
  /** Save episode (shared between perceive and chat pipelines). */
7
25
  function saveEpisode(deps, response) {
8
26
  if (!response.memoryEpisode)
9
27
  return;
10
28
  if (deps.memoryAdapter) {
11
- deps.memoryAdapter.saveEpisode(response.memoryEpisode).catch(() => { });
29
+ deps.memoryAdapter.saveEpisode(response.memoryEpisode).catch((err) => {
30
+ handlePipelineError(deps, 'save_episode', err);
31
+ });
12
32
  }
13
33
  }
14
34
  /** Handle reflection generation (LLM call + save). */
@@ -48,7 +68,9 @@ function postPerceive(deps, response) {
48
68
  return;
49
69
  saveEpisode(deps, response);
50
70
  if (deps.events) {
51
- (0, event_emitter_1.emitResponseEvents)(deps.events, deps.personaId, response, Date.now()).catch(() => { });
71
+ (0, event_emitter_1.emitResponseEvents)(deps.events, deps.personaId, response, Date.now()).catch((err) => {
72
+ handlePipelineError(deps, 'event_emit', err);
73
+ });
52
74
  }
53
75
  }
54
76
  /**
@@ -61,9 +83,13 @@ function postChat(deps, response) {
61
83
  const hasLlm = deps.engineLlm || deps.llm;
62
84
  const hasMemory = deps.memoryAdapter;
63
85
  if (hasLlm && hasMemory && response.reflectionPrompt) {
64
- handleReflection(deps, response.reflectionPrompt, response.emotion.vad).catch(() => { });
86
+ handleReflection(deps, response.reflectionPrompt, response.emotion.vad).catch((err) => {
87
+ handlePipelineError(deps, 'reflection', err);
88
+ });
65
89
  }
66
90
  if (deps.events) {
67
- (0, event_emitter_1.emitResponseEvents)(deps.events, deps.personaId, response, now).catch(() => { });
91
+ (0, event_emitter_1.emitResponseEvents)(deps.events, deps.personaId, response, now).catch((err) => {
92
+ handlePipelineError(deps, 'event_emit', err);
93
+ });
68
94
  }
69
95
  }