@sharpee/character 0.9.106 → 0.9.107

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 (137) hide show
  1. package/apply.d.ts +29 -7
  2. package/apply.d.ts.map +1 -1
  3. package/apply.js +15 -7
  4. package/apply.js.map +1 -1
  5. package/character-builder.d.ts +67 -4
  6. package/character-builder.d.ts.map +1 -1
  7. package/character-builder.js +116 -7
  8. package/character-builder.js.map +1 -1
  9. package/conversation/acl.d.ts +62 -0
  10. package/conversation/acl.d.ts.map +1 -0
  11. package/conversation/acl.js +117 -0
  12. package/conversation/acl.js.map +1 -0
  13. package/conversation/builder.d.ts +247 -0
  14. package/conversation/builder.d.ts.map +1 -0
  15. package/conversation/builder.js +324 -0
  16. package/conversation/builder.js.map +1 -0
  17. package/conversation/constraint-evaluator.d.ts +147 -0
  18. package/conversation/constraint-evaluator.d.ts.map +1 -0
  19. package/conversation/constraint-evaluator.js +247 -0
  20. package/conversation/constraint-evaluator.js.map +1 -0
  21. package/conversation/conversation-messages.d.ts +56 -0
  22. package/conversation/conversation-messages.d.ts.map +1 -0
  23. package/conversation/conversation-messages.js +69 -0
  24. package/conversation/conversation-messages.js.map +1 -0
  25. package/conversation/dialogue-extension.d.ts +87 -0
  26. package/conversation/dialogue-extension.d.ts.map +1 -0
  27. package/conversation/dialogue-extension.js +302 -0
  28. package/conversation/dialogue-extension.js.map +1 -0
  29. package/conversation/dialogue-types.d.ts +71 -0
  30. package/conversation/dialogue-types.d.ts.map +1 -0
  31. package/conversation/dialogue-types.js +13 -0
  32. package/conversation/dialogue-types.js.map +1 -0
  33. package/conversation/index.d.ts +19 -0
  34. package/conversation/index.d.ts.map +1 -0
  35. package/conversation/index.js +37 -0
  36. package/conversation/index.js.map +1 -0
  37. package/conversation/lifecycle.d.ts +212 -0
  38. package/conversation/lifecycle.d.ts.map +1 -0
  39. package/conversation/lifecycle.js +348 -0
  40. package/conversation/lifecycle.js.map +1 -0
  41. package/conversation/response-types.d.ts +98 -0
  42. package/conversation/response-types.d.ts.map +1 -0
  43. package/conversation/response-types.js +30 -0
  44. package/conversation/response-types.js.map +1 -0
  45. package/conversation/topic-registry.d.ts +130 -0
  46. package/conversation/topic-registry.d.ts.map +1 -0
  47. package/conversation/topic-registry.js +187 -0
  48. package/conversation/topic-registry.js.map +1 -0
  49. package/goals/builder.d.ts +135 -0
  50. package/goals/builder.d.ts.map +1 -0
  51. package/goals/builder.js +193 -0
  52. package/goals/builder.js.map +1 -0
  53. package/goals/goal-activation.d.ts +99 -0
  54. package/goals/goal-activation.d.ts.map +1 -0
  55. package/goals/goal-activation.js +212 -0
  56. package/goals/goal-activation.js.map +1 -0
  57. package/goals/goal-types.d.ts +138 -0
  58. package/goals/goal-types.d.ts.map +1 -0
  59. package/goals/goal-types.js +20 -0
  60. package/goals/goal-types.js.map +1 -0
  61. package/goals/index.d.ts +15 -0
  62. package/goals/index.d.ts.map +1 -0
  63. package/goals/index.js +24 -0
  64. package/goals/index.js.map +1 -0
  65. package/goals/pathfinding.d.ts +67 -0
  66. package/goals/pathfinding.d.ts.map +1 -0
  67. package/goals/pathfinding.js +134 -0
  68. package/goals/pathfinding.js.map +1 -0
  69. package/goals/step-evaluator.d.ts +52 -0
  70. package/goals/step-evaluator.d.ts.map +1 -0
  71. package/goals/step-evaluator.js +153 -0
  72. package/goals/step-evaluator.js.map +1 -0
  73. package/index.d.ts +6 -1
  74. package/index.d.ts.map +1 -1
  75. package/index.js +60 -1
  76. package/index.js.map +1 -1
  77. package/influence/builder.d.ts +136 -0
  78. package/influence/builder.d.ts.map +1 -0
  79. package/influence/builder.js +198 -0
  80. package/influence/builder.js.map +1 -0
  81. package/influence/index.d.ts +16 -0
  82. package/influence/index.d.ts.map +1 -0
  83. package/influence/index.js +25 -0
  84. package/influence/index.js.map +1 -0
  85. package/influence/influence-duration.d.ts +82 -0
  86. package/influence/influence-duration.d.ts.map +1 -0
  87. package/influence/influence-duration.js +148 -0
  88. package/influence/influence-duration.js.map +1 -0
  89. package/influence/influence-evaluator.d.ts +55 -0
  90. package/influence/influence-evaluator.d.ts.map +1 -0
  91. package/influence/influence-evaluator.js +183 -0
  92. package/influence/influence-evaluator.js.map +1 -0
  93. package/influence/influence-messages.d.ts +30 -0
  94. package/influence/influence-messages.d.ts.map +1 -0
  95. package/influence/influence-messages.js +40 -0
  96. package/influence/influence-messages.js.map +1 -0
  97. package/influence/influence-types.d.ts +123 -0
  98. package/influence/influence-types.d.ts.map +1 -0
  99. package/influence/influence-types.js +12 -0
  100. package/influence/influence-types.js.map +1 -0
  101. package/influence/pc-influence.d.ts +38 -0
  102. package/influence/pc-influence.d.ts.map +1 -0
  103. package/influence/pc-influence.js +56 -0
  104. package/influence/pc-influence.js.map +1 -0
  105. package/package.json +4 -3
  106. package/propagation/builder.d.ts +47 -0
  107. package/propagation/builder.d.ts.map +1 -0
  108. package/propagation/builder.js +46 -0
  109. package/propagation/builder.js.map +1 -0
  110. package/propagation/fact-transfer.d.ts +47 -0
  111. package/propagation/fact-transfer.d.ts.map +1 -0
  112. package/propagation/fact-transfer.js +76 -0
  113. package/propagation/fact-transfer.js.map +1 -0
  114. package/propagation/index.d.ts +16 -0
  115. package/propagation/index.d.ts.map +1 -0
  116. package/propagation/index.js +28 -0
  117. package/propagation/index.js.map +1 -0
  118. package/propagation/propagation-evaluator.d.ts +53 -0
  119. package/propagation/propagation-evaluator.d.ts.map +1 -0
  120. package/propagation/propagation-evaluator.js +231 -0
  121. package/propagation/propagation-evaluator.js.map +1 -0
  122. package/propagation/propagation-messages.d.ts +30 -0
  123. package/propagation/propagation-messages.d.ts.map +1 -0
  124. package/propagation/propagation-messages.js +37 -0
  125. package/propagation/propagation-messages.js.map +1 -0
  126. package/propagation/propagation-types.d.ts +100 -0
  127. package/propagation/propagation-types.d.ts.map +1 -0
  128. package/propagation/propagation-types.js +68 -0
  129. package/propagation/propagation-types.js.map +1 -0
  130. package/propagation/visibility.d.ts +46 -0
  131. package/propagation/visibility.d.ts.map +1 -0
  132. package/propagation/visibility.js +79 -0
  133. package/propagation/visibility.js.map +1 -0
  134. package/tick-phases.d.ts +93 -0
  135. package/tick-phases.d.ts.map +1 -0
  136. package/tick-phases.js +433 -0
  137. package/tick-phases.js.map +1 -0
@@ -0,0 +1,247 @@
1
+ /**
2
+ * Conversation builder API (ADR-142)
3
+ *
4
+ * Extends CharacterBuilder with fluent methods for defining conversation
5
+ * topics, response constraints, NPC initiative, and NPC-to-NPC scenes.
6
+ * Compiles to ConversationData stored in CompiledCharacter.
7
+ *
8
+ * Public interface: ConversationBuilder, ResponseChainBuilder,
9
+ * ConversationData, OffscreenScene, WitnessedScene, DialogueLine.
10
+ * Owner context: @sharpee/character / conversation
11
+ */
12
+ import { CharacterBuilder } from '../character-builder';
13
+ import { TopicDef } from './topic-registry';
14
+ import { ResponseCandidate } from './response-types';
15
+ import { ConversationIntent, ConversationStrength, InitiativeTrigger } from './lifecycle';
16
+ /** State mutations triggered by a response. */
17
+ export interface ResponseStateMutation {
18
+ threat?: number;
19
+ mood?: string;
20
+ disposition?: Record<string, string>;
21
+ }
22
+ /** Context settings attached to a response. */
23
+ export interface ResponseContextSettings {
24
+ label: string;
25
+ intent?: ConversationIntent;
26
+ strength?: ConversationStrength;
27
+ decayThreshold?: number;
28
+ }
29
+ /** Between-turn override keyed by turn number. */
30
+ export interface BetweenTurnOverride {
31
+ turnNumber: number;
32
+ messageId: string;
33
+ }
34
+ /** An authored response with its full metadata. */
35
+ export interface AuthoredResponse {
36
+ /** The response candidate for constraint evaluation. */
37
+ candidate: ResponseCandidate;
38
+ /** Optional context to set after this response. */
39
+ contextSettings?: ResponseContextSettings;
40
+ /** Optional state mutations to apply after this response. */
41
+ stateMutations?: ResponseStateMutation;
42
+ /** Between-turn message overrides within this response's context. */
43
+ betweenTurnOverrides?: BetweenTurnOverride[];
44
+ /** Leave-attempt message when this response's context is blocking. */
45
+ onLeaveAttemptMessage?: string;
46
+ }
47
+ /** A dialogue line in an NPC-to-NPC scene. */
48
+ export interface DialogueLine {
49
+ speaker: string;
50
+ says: string;
51
+ }
52
+ /** An offscreen NPC-to-NPC conversation (player absent). */
53
+ export interface OffscreenScene {
54
+ npcA: string;
55
+ npcB: string;
56
+ conditions: string[];
57
+ mutations: Record<string, ResponseStateMutation>;
58
+ topicUnlocks?: Record<string, string[]>;
59
+ onReturnMessage?: string;
60
+ }
61
+ /** An eavesdropping NPC-to-NPC conversation (player concealed). */
62
+ export interface WitnessedScene {
63
+ npcA: string;
64
+ npcB: string;
65
+ conditions: string[];
66
+ dialogue: DialogueLine[];
67
+ mutations: Record<string, ResponseStateMutation>;
68
+ playerLearns?: {
69
+ topic: string;
70
+ source: string;
71
+ };
72
+ discoveredBy?: {
73
+ condition: string;
74
+ messageId: string;
75
+ };
76
+ }
77
+ /** All conversation data compiled from the builder. */
78
+ export interface ConversationData {
79
+ /** Topic definitions. */
80
+ topics: TopicDef[];
81
+ /** Authored responses keyed by topic trigger (e.g., 'asked about murder'). */
82
+ responses: Map<string, AuthoredResponse[]>;
83
+ /** NPC initiative triggers. */
84
+ initiatives: InitiativeTrigger[];
85
+ /** Offscreen NPC-to-NPC scenes. */
86
+ offscreenScenes: OffscreenScene[];
87
+ /** Witnessed/eavesdropping NPC-to-NPC scenes. */
88
+ witnessedScenes: WitnessedScene[];
89
+ }
90
+ /** Create empty conversation data. */
91
+ export declare function createConversationData(): ConversationData;
92
+ /**
93
+ * Fluent builder for defining response constraints within a topic trigger.
94
+ * Each .if().action() pair becomes one ResponseCandidate.
95
+ */
96
+ export declare class ResponseChainBuilder {
97
+ private readonly parentBuilder;
98
+ private readonly trigger;
99
+ private candidates;
100
+ private currentConstraints;
101
+ private pendingContextSettings?;
102
+ private pendingStateMutations?;
103
+ private pendingBetweenTurnOverrides;
104
+ private pendingOnLeaveAttemptMessage?;
105
+ constructor(trigger: string, parent: ConversationBuilder);
106
+ /**
107
+ * Set predicate constraints for the next response.
108
+ * All predicates must be satisfied for this response to be selected.
109
+ *
110
+ * @param predicates - Predicate names
111
+ * @returns this for chaining
112
+ */
113
+ if(...predicates: string[]): ResponseChainBuilder;
114
+ /**
115
+ * Mark the next response as the fallback (no constraints).
116
+ *
117
+ * @returns this for chaining
118
+ */
119
+ otherwise(): ResponseChainBuilder;
120
+ private addResponse;
121
+ /** Share the information truthfully. */
122
+ tell(messageId: string, params?: Record<string, () => unknown>): ResponseChainBuilder;
123
+ /** Provide false information. */
124
+ lie(messageId: string): ResponseChainBuilder;
125
+ /** Change the subject. */
126
+ deflect(messageId: string): ResponseChainBuilder;
127
+ /** Explicitly refuse to answer. */
128
+ refuse(messageId: string): ResponseChainBuilder;
129
+ /** Know but don't mention. */
130
+ omit(messageId: string): ResponseChainBuilder;
131
+ /** Reveal previously hidden truth. */
132
+ confess(messageId: string): ResponseChainBuilder;
133
+ /** Fill gaps with invented details (NPC believes them). */
134
+ confabulate(messageId: string): ResponseChainBuilder;
135
+ /** Turn the question around. */
136
+ askBack(messageId: string): ResponseChainBuilder;
137
+ /**
138
+ * Set conversation context after this response.
139
+ *
140
+ * @param label - Context label
141
+ * @param opts - Optional intent, strength, decay threshold
142
+ * @returns this for chaining
143
+ */
144
+ setsContext(label: string, opts?: {
145
+ intent?: ConversationIntent;
146
+ strength?: ConversationStrength;
147
+ decayThreshold?: number;
148
+ }): ResponseChainBuilder;
149
+ /**
150
+ * Override between-turn commentary within this response's context.
151
+ *
152
+ * @param turnNumber - Which non-conversation turn this fires on
153
+ * @param messageId - The message ID
154
+ * @returns this for chaining
155
+ */
156
+ betweenTurns(turnNumber: number, messageId: string): ResponseChainBuilder;
157
+ /**
158
+ * Set the message shown when the player tries to leave during a blocking context.
159
+ *
160
+ * @param messageId - The message ID
161
+ * @returns this for chaining
162
+ */
163
+ onLeaveAttempt(messageId: string): ResponseChainBuilder;
164
+ /**
165
+ * Apply state mutations after this response.
166
+ *
167
+ * @param mutations - State changes (threat, mood, disposition)
168
+ * @returns this for chaining
169
+ */
170
+ updatesState(mutations: ResponseStateMutation): ResponseChainBuilder;
171
+ /**
172
+ * Start a new .when() trigger chain, finalizing this one.
173
+ *
174
+ * @param trigger - The new trigger (e.g., 'asked about weapon')
175
+ * @returns A new ResponseChainBuilder for the new trigger
176
+ */
177
+ when(trigger: string): ResponseChainBuilder;
178
+ /**
179
+ * Return to the parent builder, finalizing this chain.
180
+ *
181
+ * @returns The parent ConversationBuilder
182
+ */
183
+ done(): ConversationBuilder;
184
+ /** @internal Finalize this chain and push candidates to parent. */
185
+ finalize(): void;
186
+ /** @internal Get candidates without finalizing (for testing). */
187
+ _getCandidates(): AuthoredResponse[];
188
+ }
189
+ /**
190
+ * Extends CharacterBuilder with conversation-specific methods.
191
+ * Accumulates conversation data and compiles it alongside
192
+ * the character model data.
193
+ */
194
+ export declare class ConversationBuilder extends CharacterBuilder {
195
+ private readonly _conversationData;
196
+ private _activeChain?;
197
+ /**
198
+ * Define a conversation topic.
199
+ *
200
+ * @param name - The canonical topic name
201
+ * @param def - Topic definition (keywords, related, availableWhen)
202
+ * @returns this for chaining
203
+ */
204
+ topic(name: string, def: Omit<TopicDef, 'name'>): ConversationBuilder;
205
+ /**
206
+ * Begin a response chain for a trigger.
207
+ * The trigger is typically 'asked about {topic}' or 'told about {topic}'.
208
+ *
209
+ * @param trigger - The trigger string
210
+ * @returns A ResponseChainBuilder for fluent chaining
211
+ */
212
+ when(trigger: string): ResponseChainBuilder;
213
+ /** @internal Called by ResponseChainBuilder to register completed responses. */
214
+ _addResponses(trigger: string, responses: AuthoredResponse[]): void;
215
+ /**
216
+ * Define when this NPC initiates conversation proactively.
217
+ *
218
+ * @param conditions - Predicate conditions
219
+ * @param messageId - The message ID when the NPC initiates
220
+ * @returns this for chaining
221
+ */
222
+ initiates(conditions: string[], messageId: string): ConversationBuilder;
223
+ /**
224
+ * Define an offscreen NPC-to-NPC conversation (player absent).
225
+ *
226
+ * @param scene - The offscreen scene definition
227
+ * @returns this for chaining
228
+ */
229
+ offscreen(scene: OffscreenScene): ConversationBuilder;
230
+ /**
231
+ * Define an eavesdropping scene (player concealed).
232
+ *
233
+ * @param scene - The witnessed scene definition
234
+ * @returns this for chaining
235
+ */
236
+ witnessed(scene: WitnessedScene): ConversationBuilder;
237
+ /**
238
+ * Get the compiled conversation data.
239
+ * Finalizes any pending response chain.
240
+ *
241
+ * @returns The conversation data
242
+ */
243
+ getConversationData(): ConversationData;
244
+ /** Finalize any pending response chain builder. */
245
+ private _finalizePendingChain;
246
+ }
247
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../../../repos/sharpee/packages/character/src/conversation/builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,324 @@
1
+ "use strict";
2
+ /**
3
+ * Conversation builder API (ADR-142)
4
+ *
5
+ * Extends CharacterBuilder with fluent methods for defining conversation
6
+ * topics, response constraints, NPC initiative, and NPC-to-NPC scenes.
7
+ * Compiles to ConversationData stored in CompiledCharacter.
8
+ *
9
+ * Public interface: ConversationBuilder, ResponseChainBuilder,
10
+ * ConversationData, OffscreenScene, WitnessedScene, DialogueLine.
11
+ * Owner context: @sharpee/character / conversation
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.ConversationBuilder = exports.ResponseChainBuilder = void 0;
15
+ exports.createConversationData = createConversationData;
16
+ const character_builder_1 = require("../character-builder");
17
+ /** Create empty conversation data. */
18
+ function createConversationData() {
19
+ return {
20
+ topics: [],
21
+ responses: new Map(),
22
+ initiatives: [],
23
+ offscreenScenes: [],
24
+ witnessedScenes: [],
25
+ };
26
+ }
27
+ // ---------------------------------------------------------------------------
28
+ // Response chain builder (fluent chain for .when().if().tell() etc.)
29
+ // ---------------------------------------------------------------------------
30
+ /**
31
+ * Fluent builder for defining response constraints within a topic trigger.
32
+ * Each .if().action() pair becomes one ResponseCandidate.
33
+ */
34
+ class ResponseChainBuilder {
35
+ parentBuilder;
36
+ trigger;
37
+ candidates = [];
38
+ currentConstraints = [];
39
+ pendingContextSettings;
40
+ pendingStateMutations;
41
+ pendingBetweenTurnOverrides = [];
42
+ pendingOnLeaveAttemptMessage;
43
+ constructor(trigger, parent) {
44
+ this.trigger = trigger;
45
+ this.parentBuilder = parent;
46
+ }
47
+ // =========================================================================
48
+ // Constraint setting
49
+ // =========================================================================
50
+ /**
51
+ * Set predicate constraints for the next response.
52
+ * All predicates must be satisfied for this response to be selected.
53
+ *
54
+ * @param predicates - Predicate names
55
+ * @returns this for chaining
56
+ */
57
+ if(...predicates) {
58
+ this.currentConstraints = predicates;
59
+ return this;
60
+ }
61
+ /**
62
+ * Mark the next response as the fallback (no constraints).
63
+ *
64
+ * @returns this for chaining
65
+ */
66
+ otherwise() {
67
+ this.currentConstraints = [];
68
+ return this;
69
+ }
70
+ // =========================================================================
71
+ // Response actions
72
+ // =========================================================================
73
+ addResponse(action, messageId, params) {
74
+ const authored = {
75
+ candidate: {
76
+ action,
77
+ messageId,
78
+ constraints: [...this.currentConstraints],
79
+ params,
80
+ },
81
+ contextSettings: this.pendingContextSettings,
82
+ stateMutations: this.pendingStateMutations,
83
+ betweenTurnOverrides: this.pendingBetweenTurnOverrides.length > 0
84
+ ? [...this.pendingBetweenTurnOverrides]
85
+ : undefined,
86
+ onLeaveAttemptMessage: this.pendingOnLeaveAttemptMessage,
87
+ };
88
+ this.candidates.push(authored);
89
+ // Reset pending state for next response
90
+ this.currentConstraints = [];
91
+ this.pendingContextSettings = undefined;
92
+ this.pendingStateMutations = undefined;
93
+ this.pendingBetweenTurnOverrides = [];
94
+ this.pendingOnLeaveAttemptMessage = undefined;
95
+ return this;
96
+ }
97
+ /** Share the information truthfully. */
98
+ tell(messageId, params) {
99
+ return this.addResponse('tell', messageId, params);
100
+ }
101
+ /** Provide false information. */
102
+ lie(messageId) {
103
+ return this.addResponse('lie', messageId);
104
+ }
105
+ /** Change the subject. */
106
+ deflect(messageId) {
107
+ return this.addResponse('deflect', messageId);
108
+ }
109
+ /** Explicitly refuse to answer. */
110
+ refuse(messageId) {
111
+ return this.addResponse('refuse', messageId);
112
+ }
113
+ /** Know but don't mention. */
114
+ omit(messageId) {
115
+ return this.addResponse('omit', messageId);
116
+ }
117
+ /** Reveal previously hidden truth. */
118
+ confess(messageId) {
119
+ return this.addResponse('confess', messageId);
120
+ }
121
+ /** Fill gaps with invented details (NPC believes them). */
122
+ confabulate(messageId) {
123
+ return this.addResponse('confabulate', messageId);
124
+ }
125
+ /** Turn the question around. */
126
+ askBack(messageId) {
127
+ return this.addResponse('ask back', messageId);
128
+ }
129
+ // =========================================================================
130
+ // Response modifiers (applied to the NEXT response added)
131
+ // =========================================================================
132
+ /**
133
+ * Set conversation context after this response.
134
+ *
135
+ * @param label - Context label
136
+ * @param opts - Optional intent, strength, decay threshold
137
+ * @returns this for chaining
138
+ */
139
+ setsContext(label, opts) {
140
+ this.pendingContextSettings = {
141
+ label,
142
+ intent: opts?.intent,
143
+ strength: opts?.strength,
144
+ decayThreshold: opts?.decayThreshold,
145
+ };
146
+ return this;
147
+ }
148
+ /**
149
+ * Override between-turn commentary within this response's context.
150
+ *
151
+ * @param turnNumber - Which non-conversation turn this fires on
152
+ * @param messageId - The message ID
153
+ * @returns this for chaining
154
+ */
155
+ betweenTurns(turnNumber, messageId) {
156
+ this.pendingBetweenTurnOverrides.push({ turnNumber, messageId });
157
+ return this;
158
+ }
159
+ /**
160
+ * Set the message shown when the player tries to leave during a blocking context.
161
+ *
162
+ * @param messageId - The message ID
163
+ * @returns this for chaining
164
+ */
165
+ onLeaveAttempt(messageId) {
166
+ this.pendingOnLeaveAttemptMessage = messageId;
167
+ return this;
168
+ }
169
+ /**
170
+ * Apply state mutations after this response.
171
+ *
172
+ * @param mutations - State changes (threat, mood, disposition)
173
+ * @returns this for chaining
174
+ */
175
+ updatesState(mutations) {
176
+ this.pendingStateMutations = mutations;
177
+ return this;
178
+ }
179
+ // =========================================================================
180
+ // Finalization
181
+ // =========================================================================
182
+ /**
183
+ * Start a new .when() trigger chain, finalizing this one.
184
+ *
185
+ * @param trigger - The new trigger (e.g., 'asked about weapon')
186
+ * @returns A new ResponseChainBuilder for the new trigger
187
+ */
188
+ when(trigger) {
189
+ this.finalize();
190
+ return this.parentBuilder.when(trigger);
191
+ }
192
+ /**
193
+ * Return to the parent builder, finalizing this chain.
194
+ *
195
+ * @returns The parent ConversationBuilder
196
+ */
197
+ done() {
198
+ this.finalize();
199
+ return this.parentBuilder;
200
+ }
201
+ /** @internal Finalize this chain and push candidates to parent. */
202
+ finalize() {
203
+ if (this.candidates.length > 0) {
204
+ this.parentBuilder._addResponses(this.trigger, this.candidates);
205
+ this.candidates = [];
206
+ }
207
+ }
208
+ /** @internal Get candidates without finalizing (for testing). */
209
+ _getCandidates() {
210
+ return this.candidates;
211
+ }
212
+ }
213
+ exports.ResponseChainBuilder = ResponseChainBuilder;
214
+ // ---------------------------------------------------------------------------
215
+ // Conversation builder (extends CharacterBuilder)
216
+ // ---------------------------------------------------------------------------
217
+ /**
218
+ * Extends CharacterBuilder with conversation-specific methods.
219
+ * Accumulates conversation data and compiles it alongside
220
+ * the character model data.
221
+ */
222
+ class ConversationBuilder extends character_builder_1.CharacterBuilder {
223
+ _conversationData = createConversationData();
224
+ _activeChain;
225
+ // =========================================================================
226
+ // Topic registration
227
+ // =========================================================================
228
+ /**
229
+ * Define a conversation topic.
230
+ *
231
+ * @param name - The canonical topic name
232
+ * @param def - Topic definition (keywords, related, availableWhen)
233
+ * @returns this for chaining
234
+ */
235
+ topic(name, def) {
236
+ this._conversationData.topics.push({ name, ...def });
237
+ return this;
238
+ }
239
+ // =========================================================================
240
+ // Response chains
241
+ // =========================================================================
242
+ /**
243
+ * Begin a response chain for a trigger.
244
+ * The trigger is typically 'asked about {topic}' or 'told about {topic}'.
245
+ *
246
+ * @param trigger - The trigger string
247
+ * @returns A ResponseChainBuilder for fluent chaining
248
+ */
249
+ when(trigger) {
250
+ // Finalize any pending chain
251
+ this._finalizePendingChain();
252
+ const chain = new ResponseChainBuilder(trigger, this);
253
+ this._activeChain = chain;
254
+ return chain;
255
+ }
256
+ /** @internal Called by ResponseChainBuilder to register completed responses. */
257
+ _addResponses(trigger, responses) {
258
+ const existing = this._conversationData.responses.get(trigger) ?? [];
259
+ existing.push(...responses);
260
+ this._conversationData.responses.set(trigger, existing);
261
+ }
262
+ // =========================================================================
263
+ // NPC initiative
264
+ // =========================================================================
265
+ /**
266
+ * Define when this NPC initiates conversation proactively.
267
+ *
268
+ * @param conditions - Predicate conditions
269
+ * @param messageId - The message ID when the NPC initiates
270
+ * @returns this for chaining
271
+ */
272
+ initiates(conditions, messageId) {
273
+ this._conversationData.initiatives.push({ conditions, messageId });
274
+ return this;
275
+ }
276
+ // =========================================================================
277
+ // NPC-to-NPC scenes
278
+ // =========================================================================
279
+ /**
280
+ * Define an offscreen NPC-to-NPC conversation (player absent).
281
+ *
282
+ * @param scene - The offscreen scene definition
283
+ * @returns this for chaining
284
+ */
285
+ offscreen(scene) {
286
+ this._conversationData.offscreenScenes.push(scene);
287
+ return this;
288
+ }
289
+ /**
290
+ * Define an eavesdropping scene (player concealed).
291
+ *
292
+ * @param scene - The witnessed scene definition
293
+ * @returns this for chaining
294
+ */
295
+ witnessed(scene) {
296
+ this._conversationData.witnessedScenes.push(scene);
297
+ return this;
298
+ }
299
+ // =========================================================================
300
+ // Conversation data access
301
+ // =========================================================================
302
+ /**
303
+ * Get the compiled conversation data.
304
+ * Finalizes any pending response chain.
305
+ *
306
+ * @returns The conversation data
307
+ */
308
+ getConversationData() {
309
+ this._finalizePendingChain();
310
+ return this._conversationData;
311
+ }
312
+ // =========================================================================
313
+ // Private helpers
314
+ // =========================================================================
315
+ /** Finalize any pending response chain builder. */
316
+ _finalizePendingChain() {
317
+ if (this._activeChain) {
318
+ this._activeChain.finalize();
319
+ this._activeChain = undefined;
320
+ }
321
+ }
322
+ }
323
+ exports.ConversationBuilder = ConversationBuilder;
324
+ //# sourceMappingURL=builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.js","sourceRoot":"","sources":["../../../../../../../repos/sharpee/packages/character/src/conversation/builder.ts"],"names":[],"mappings":"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"}