duralogue 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Noah Ribaudo
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,41 @@
1
+ # duralogue
2
+
3
+ Durable obligations and delivery truth for conversational agents.
4
+
5
+ Most agent frameworks remember messages. Duralogue tracks what the agent still owes, whether work is current, and whether the answer actually reached the person.
6
+
7
+ ```ts
8
+ import { DialogueKernel } from "duralogue";
9
+
10
+ const dialogue = new DialogueKernel();
11
+ const accepted = dialogue.acceptMessage({
12
+ conversationId: "support-42",
13
+ participantId: "customer",
14
+ transportEventId: "message-1",
15
+ text: "Please investigate the failed payment.",
16
+ });
17
+
18
+ const task = dialogue.startTask(accepted.obligationId!);
19
+ dialogue.completeTask(task.taskId, task.revision, { cause: "expired card" });
20
+
21
+ const response = dialogue.stageFinalResponse(
22
+ accepted.obligationId!,
23
+ "The card expired. Add a new card and retry the payment.",
24
+ );
25
+ dialogue.markDeliverySent(response.deliveryId, "provider-receipt-1");
26
+ ```
27
+
28
+ ## The first useful core
29
+
30
+ - Deduplicates inbound transport events.
31
+ - Keeps acknowledgements separate from final answers.
32
+ - Rejects stale or cancelled worker results.
33
+ - Preserves staged responses across snapshots and restarts.
34
+ - Treats unknown-after-send as ambiguous instead of blindly retrying.
35
+ - Requires playback and grounding before spoken answers fulfill an obligation.
36
+ - Requires explicit evidence before one channel changes another channel's work.
37
+ - Exposes a scoreboard for recovery scans and user-visible status.
38
+
39
+ The package is framework-neutral and has no runtime dependencies. Persistence and transport adapters remain the host application's responsibility.
40
+
41
+ `0.1.x` is an early reference implementation. Its API may evolve before `1.0`.
@@ -0,0 +1,143 @@
1
+ export type ObligationState = "OPEN" | "ACKNOWLEDGED" | "IN_PROGRESS" | "WAITING_ON_WORK" | "RESPONSE_STAGED" | "FULFILLED" | "CANCELLED" | "FAILED_VISIBLE";
2
+ export type DeliveryState = "PENDING" | "SENT" | "UNKNOWN_AFTER_SEND" | "PLAYED" | "INTERRUPTED" | "GROUNDING_PENDING" | "GROUNDED" | "FAILED" | "CANCELLED";
3
+ export type GroundingState = "NOT_REQUIRED" | "PENDING" | "GROUNDED" | "REPAIR_REQUESTED" | "INTERRUPTED" | "FAILED";
4
+ export type TaskState = "RUNNING" | "COMPLETED" | "STALE_REJECTED" | "CANCELLED";
5
+ export interface DialogueEvent {
6
+ eventId: string;
7
+ sequence: number;
8
+ conversationId: string;
9
+ type: string;
10
+ actorKind: string;
11
+ payload: Record<string, unknown>;
12
+ }
13
+ export interface Obligation {
14
+ obligationId: string;
15
+ conversationId: string;
16
+ sourceEventIds: string[];
17
+ kind: "visible_response";
18
+ state: ObligationState;
19
+ requiresVisibleResponse: true;
20
+ revision: number;
21
+ finalDeliveryId?: string;
22
+ relationshipId?: string;
23
+ channelId?: string;
24
+ modality: "text" | "voice";
25
+ interactionMode: "async" | "sync";
26
+ linkedChannelId?: string;
27
+ }
28
+ export interface Task<Result = unknown> {
29
+ taskId: string;
30
+ obligationId: string;
31
+ conversationId: string;
32
+ revision: number;
33
+ state: TaskState;
34
+ result?: Result;
35
+ }
36
+ export interface ResponseIntent {
37
+ deliveryId: string;
38
+ conversationId: string;
39
+ obligationId: string;
40
+ responseKind: "acknowledgement" | "final" | "failure" | "cancellation";
41
+ text: string;
42
+ idempotencyKey: string;
43
+ status: DeliveryState;
44
+ receipt?: string;
45
+ relationshipId?: string;
46
+ channelId?: string;
47
+ modality: "text" | "voice";
48
+ interactionMode: "async" | "sync";
49
+ groundingState: GroundingState;
50
+ playbackCompleted: boolean;
51
+ interrupted: boolean;
52
+ }
53
+ export interface AcceptMessageInput {
54
+ conversationId: string;
55
+ participantId: string;
56
+ transportEventId: string;
57
+ text: string;
58
+ relationshipId?: string;
59
+ channelId?: string;
60
+ modality?: "text" | "voice";
61
+ interactionMode?: "async" | "sync";
62
+ linkedChannelId?: string;
63
+ }
64
+ export type AcceptResult = {
65
+ duplicate: true;
66
+ eventId: string;
67
+ obligationId: null;
68
+ } | {
69
+ duplicate: false;
70
+ eventId: string;
71
+ obligationId: string;
72
+ } | {
73
+ duplicate: false;
74
+ eventId: string;
75
+ cancelled: string[];
76
+ } | {
77
+ duplicate: false;
78
+ eventId: string;
79
+ status: Scoreboard;
80
+ };
81
+ export interface Scoreboard {
82
+ openObligations: string[];
83
+ pendingDeliveries: string[];
84
+ ambiguousDeliveries: string[];
85
+ groundingPendingDeliveries: string[];
86
+ activeTasks: string[];
87
+ }
88
+ export interface DialogueSnapshot {
89
+ events: DialogueEvent[];
90
+ obligations: Obligation[];
91
+ tasks: Task[];
92
+ responses: ResponseIntent[];
93
+ inboundIndex: [string, string][];
94
+ rawTail: [string, string[]][];
95
+ counters: Record<"event" | "obligation" | "task" | "delivery", number>;
96
+ }
97
+ export declare class ContinuityError extends Error {
98
+ name: string;
99
+ }
100
+ export declare class DialogueKernel {
101
+ readonly events: DialogueEvent[];
102
+ readonly obligations: Map<string, Obligation>;
103
+ readonly tasks: Map<string, Task<unknown>>;
104
+ readonly responses: Map<string, ResponseIntent>;
105
+ private readonly inboundIndex;
106
+ private readonly rawTail;
107
+ private readonly counters;
108
+ acceptMessage(input: AcceptMessageInput): AcceptResult;
109
+ acceptVoiceTranscript(input: Omit<AcceptMessageInput, "transportEventId" | "modality" | "interactionMode"> & {
110
+ voiceEventId: string;
111
+ }): AcceptResult;
112
+ acknowledge(obligationId: string, text: string): ResponseIntent;
113
+ startTask(obligationId: string): Task;
114
+ amendObligation(obligationId: string, sourceEventId?: string): Obligation;
115
+ completeTask<Result>(taskId: string, revision: number, result: Result): Task<Result>;
116
+ stageFinalResponse(obligationId: string, text: string): ResponseIntent;
117
+ stageSpokenResponse(obligationId: string, text: string): ResponseIntent;
118
+ markDeliverySent(deliveryId: string, receipt: string): ResponseIntent;
119
+ markUnknownAfterSend(deliveryId: string): ResponseIntent;
120
+ markVoicePlaybackDone(deliveryId: string): ResponseIntent;
121
+ markVoiceInterrupted(deliveryId: string): ResponseIntent;
122
+ markVoiceGrounded(deliveryId: string, receipt: string): ResponseIntent;
123
+ requestVoiceRepair(deliveryId: string, reason: string): ResponseIntent;
124
+ cancelObligationFromChannel(obligationId: string, sourceChannelId: string, explicitLink?: boolean): Obligation;
125
+ cancelOpenWork(conversationId: string, sourceEventId?: string): string[];
126
+ scoreboard(conversationId: string): Scoreboard;
127
+ compactProjection(conversationId: string): {
128
+ rawTail: string[];
129
+ openObligations: Obligation[];
130
+ scoreboard: Scoreboard;
131
+ };
132
+ snapshot(): DialogueSnapshot;
133
+ static fromSnapshot(snapshot: DialogueSnapshot): DialogueKernel;
134
+ private guardVisibleResponse;
135
+ private createResponse;
136
+ private appendEvent;
137
+ private nextId;
138
+ private classify;
139
+ private getObligation;
140
+ private getTask;
141
+ private getResponse;
142
+ }
143
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,302 @@
1
+ export class ContinuityError extends Error {
2
+ name = "ContinuityError";
3
+ }
4
+ const TERMINAL = new Set(["FULFILLED", "CANCELLED", "FAILED_VISIBLE"]);
5
+ const GENERIC_RESETS = ["what can i help you with", "how can i assist", "how may i help"];
6
+ export class DialogueKernel {
7
+ events = [];
8
+ obligations = new Map();
9
+ tasks = new Map();
10
+ responses = new Map();
11
+ inboundIndex = new Map();
12
+ rawTail = new Map();
13
+ counters = { event: 0, obligation: 0, task: 0, delivery: 0 };
14
+ acceptMessage(input) {
15
+ const key = `${input.conversationId}\0${input.transportEventId}`;
16
+ const existing = this.inboundIndex.get(key);
17
+ if (existing)
18
+ return { duplicate: true, eventId: existing, obligationId: null };
19
+ const event = this.appendEvent(input.conversationId, "inbound.accepted", "human", { ...input });
20
+ this.inboundIndex.set(key, event.eventId);
21
+ this.rawTail.set(input.conversationId, [...(this.rawTail.get(input.conversationId) ?? []), input.text].slice(-10));
22
+ const relation = this.classify(input.text);
23
+ if (relation === "cancellation") {
24
+ return { duplicate: false, eventId: event.eventId, cancelled: this.cancelOpenWork(input.conversationId, event.eventId) };
25
+ }
26
+ if (relation === "status_query") {
27
+ return { duplicate: false, eventId: event.eventId, status: this.scoreboard(input.conversationId) };
28
+ }
29
+ const obligationId = this.nextId("obligation", "obl");
30
+ this.obligations.set(obligationId, {
31
+ obligationId,
32
+ conversationId: input.conversationId,
33
+ sourceEventIds: [event.eventId],
34
+ kind: "visible_response",
35
+ state: "OPEN",
36
+ requiresVisibleResponse: true,
37
+ revision: 1,
38
+ ...(input.relationshipId ? { relationshipId: input.relationshipId } : {}),
39
+ ...(input.channelId ? { channelId: input.channelId } : {}),
40
+ modality: input.modality ?? "text",
41
+ interactionMode: input.interactionMode ?? "async",
42
+ ...(input.linkedChannelId ? { linkedChannelId: input.linkedChannelId } : {}),
43
+ });
44
+ this.appendEvent(input.conversationId, "obligation.opened", "system", { obligationId, sourceEventId: event.eventId });
45
+ return { duplicate: false, eventId: event.eventId, obligationId };
46
+ }
47
+ acceptVoiceTranscript(input) {
48
+ return this.acceptMessage({ ...input, transportEventId: input.voiceEventId, modality: "voice", interactionMode: "sync" });
49
+ }
50
+ acknowledge(obligationId, text) {
51
+ const obligation = this.getObligation(obligationId);
52
+ if (TERMINAL.has(obligation.state))
53
+ throw new ContinuityError("Cannot acknowledge a terminal obligation.");
54
+ const response = this.createResponse(obligation, "acknowledgement", text);
55
+ obligation.state = "ACKNOWLEDGED";
56
+ this.appendEvent(obligation.conversationId, "obligation.acknowledged", "main_agent", { obligationId, deliveryId: response.deliveryId });
57
+ return response;
58
+ }
59
+ startTask(obligationId) {
60
+ const obligation = this.getObligation(obligationId);
61
+ if (obligation.state === "CANCELLED")
62
+ throw new ContinuityError("Cannot start a task for a cancelled obligation.");
63
+ const taskId = this.nextId("task", "task");
64
+ const task = { taskId, obligationId, conversationId: obligation.conversationId, revision: obligation.revision, state: "RUNNING" };
65
+ this.tasks.set(taskId, task);
66
+ obligation.state = "WAITING_ON_WORK";
67
+ this.appendEvent(obligation.conversationId, "task.created", "system", { taskId, obligationId, revision: task.revision });
68
+ return task;
69
+ }
70
+ amendObligation(obligationId, sourceEventId) {
71
+ const obligation = this.getObligation(obligationId);
72
+ if (TERMINAL.has(obligation.state))
73
+ throw new ContinuityError("Cannot amend a terminal obligation.");
74
+ obligation.revision += 1;
75
+ this.appendEvent(obligation.conversationId, "obligation.revised", "human", { obligationId, revision: obligation.revision, sourceEventId });
76
+ return obligation;
77
+ }
78
+ completeTask(taskId, revision, result) {
79
+ const task = this.getTask(taskId);
80
+ const obligation = this.getObligation(task.obligationId);
81
+ if (obligation.state === "CANCELLED") {
82
+ task.state = "CANCELLED";
83
+ this.appendEvent(task.conversationId, "worker.result.cancelled", "worker_agent", { taskId, revision });
84
+ return task;
85
+ }
86
+ if (revision !== obligation.revision) {
87
+ task.state = "STALE_REJECTED";
88
+ this.appendEvent(task.conversationId, "worker.result.stale_rejected", "worker_agent", { taskId, resultRevision: revision, currentRevision: obligation.revision });
89
+ return task;
90
+ }
91
+ task.state = "COMPLETED";
92
+ task.result = structuredClone(result);
93
+ obligation.state = "IN_PROGRESS";
94
+ this.appendEvent(task.conversationId, "worker.result.accepted", "worker_agent", { taskId, revision, result });
95
+ return task;
96
+ }
97
+ stageFinalResponse(obligationId, text) {
98
+ const obligation = this.getObligation(obligationId);
99
+ this.guardVisibleResponse(obligation, text);
100
+ const response = this.createResponse(obligation, "final", text);
101
+ obligation.state = "RESPONSE_STAGED";
102
+ obligation.finalDeliveryId = response.deliveryId;
103
+ this.appendEvent(obligation.conversationId, "response.staged", "main_agent", { obligationId, deliveryId: response.deliveryId });
104
+ return response;
105
+ }
106
+ stageSpokenResponse(obligationId, text) {
107
+ const obligation = this.getObligation(obligationId);
108
+ this.guardVisibleResponse(obligation, text);
109
+ const response = this.createResponse(obligation, "final", text, "voice");
110
+ response.groundingState = "PENDING";
111
+ obligation.state = "RESPONSE_STAGED";
112
+ obligation.finalDeliveryId = response.deliveryId;
113
+ this.appendEvent(obligation.conversationId, "voice.response_started", "main_agent", { obligationId, deliveryId: response.deliveryId });
114
+ return response;
115
+ }
116
+ markDeliverySent(deliveryId, receipt) {
117
+ const response = this.getResponse(deliveryId);
118
+ const obligation = this.getObligation(response.obligationId);
119
+ response.status = "SENT";
120
+ response.receipt = receipt;
121
+ obligation.state = response.responseKind === "acknowledgement" ? "ACKNOWLEDGED" : "FULFILLED";
122
+ this.appendEvent(response.conversationId, "delivery.receipt_committed", "platform", { deliveryId, receipt });
123
+ return response;
124
+ }
125
+ markUnknownAfterSend(deliveryId) {
126
+ const response = this.getResponse(deliveryId);
127
+ response.status = "UNKNOWN_AFTER_SEND";
128
+ this.appendEvent(response.conversationId, "delivery.unknown_after_send", "platform", { deliveryId });
129
+ return response;
130
+ }
131
+ markVoicePlaybackDone(deliveryId) {
132
+ const response = this.getResponse(deliveryId);
133
+ if (response.modality !== "voice")
134
+ throw new ContinuityError("Playback applies only to voice responses.");
135
+ response.playbackCompleted = true;
136
+ response.status = "GROUNDING_PENDING";
137
+ this.appendEvent(response.conversationId, "voice.playback_completed", "platform", { deliveryId });
138
+ return response;
139
+ }
140
+ markVoiceInterrupted(deliveryId) {
141
+ const response = this.getResponse(deliveryId);
142
+ response.interrupted = true;
143
+ response.status = "INTERRUPTED";
144
+ response.groundingState = "INTERRUPTED";
145
+ this.appendEvent(response.conversationId, "voice.interrupted", "human", { deliveryId });
146
+ return response;
147
+ }
148
+ markVoiceGrounded(deliveryId, receipt) {
149
+ const response = this.getResponse(deliveryId);
150
+ if (!response.playbackCompleted || response.interrupted || response.groundingState === "REPAIR_REQUESTED") {
151
+ throw new ContinuityError("A voice response must finish playback without interruption or repair before grounding.");
152
+ }
153
+ response.status = "GROUNDED";
154
+ response.groundingState = "GROUNDED";
155
+ response.receipt = receipt;
156
+ this.getObligation(response.obligationId).state = "FULFILLED";
157
+ this.appendEvent(response.conversationId, "voice.grounded", "human", { deliveryId, receipt });
158
+ return response;
159
+ }
160
+ requestVoiceRepair(deliveryId, reason) {
161
+ const response = this.getResponse(deliveryId);
162
+ response.groundingState = "REPAIR_REQUESTED";
163
+ this.getObligation(response.obligationId).state = "IN_PROGRESS";
164
+ this.appendEvent(response.conversationId, "voice.repair_requested", "human", { deliveryId, reason });
165
+ return response;
166
+ }
167
+ cancelObligationFromChannel(obligationId, sourceChannelId, explicitLink = false) {
168
+ const obligation = this.getObligation(obligationId);
169
+ if (obligation.channelId && obligation.channelId !== sourceChannelId && !explicitLink && obligation.linkedChannelId !== sourceChannelId) {
170
+ throw new ContinuityError("Cross-channel cancellation requires explicit link evidence.");
171
+ }
172
+ obligation.state = "CANCELLED";
173
+ for (const task of this.tasks.values())
174
+ if (task.obligationId === obligationId && task.state === "RUNNING")
175
+ task.state = "CANCELLED";
176
+ this.appendEvent(obligation.conversationId, "obligation.cancelled", "human", { obligationId, sourceChannelId, explicitLink });
177
+ return obligation;
178
+ }
179
+ cancelOpenWork(conversationId, sourceEventId) {
180
+ const cancelled = [];
181
+ for (const obligation of this.obligations.values()) {
182
+ if (obligation.conversationId !== conversationId || TERMINAL.has(obligation.state))
183
+ continue;
184
+ obligation.state = "CANCELLED";
185
+ cancelled.push(obligation.obligationId);
186
+ for (const task of this.tasks.values())
187
+ if (task.obligationId === obligation.obligationId && task.state === "RUNNING")
188
+ task.state = "CANCELLED";
189
+ this.appendEvent(conversationId, "obligation.cancelled", "human", { obligationId: obligation.obligationId, sourceEventId });
190
+ }
191
+ return cancelled;
192
+ }
193
+ scoreboard(conversationId) {
194
+ const open = [...this.obligations.values()].filter((item) => item.conversationId === conversationId && !TERMINAL.has(item.state));
195
+ return {
196
+ openObligations: open.map((item) => item.obligationId),
197
+ pendingDeliveries: [...this.responses.values()].filter((item) => item.conversationId === conversationId && item.status === "PENDING").map((item) => item.deliveryId),
198
+ ambiguousDeliveries: [...this.responses.values()].filter((item) => item.conversationId === conversationId && item.status === "UNKNOWN_AFTER_SEND").map((item) => item.deliveryId),
199
+ groundingPendingDeliveries: [...this.responses.values()].filter((item) => item.conversationId === conversationId && item.status === "GROUNDING_PENDING").map((item) => item.deliveryId),
200
+ activeTasks: [...this.tasks.values()].filter((item) => item.conversationId === conversationId && item.state === "RUNNING").map((item) => item.taskId),
201
+ };
202
+ }
203
+ compactProjection(conversationId) {
204
+ return {
205
+ rawTail: structuredClone(this.rawTail.get(conversationId) ?? []),
206
+ openObligations: structuredClone([...this.obligations.values()].filter((item) => item.conversationId === conversationId && !TERMINAL.has(item.state))),
207
+ scoreboard: this.scoreboard(conversationId),
208
+ };
209
+ }
210
+ snapshot() {
211
+ return structuredClone({
212
+ events: this.events,
213
+ obligations: [...this.obligations.values()],
214
+ tasks: [...this.tasks.values()],
215
+ responses: [...this.responses.values()],
216
+ inboundIndex: [...this.inboundIndex.entries()],
217
+ rawTail: [...this.rawTail.entries()],
218
+ counters: this.counters,
219
+ });
220
+ }
221
+ static fromSnapshot(snapshot) {
222
+ const kernel = new DialogueKernel();
223
+ kernel.events.push(...structuredClone(snapshot.events));
224
+ for (const item of snapshot.obligations)
225
+ kernel.obligations.set(item.obligationId, structuredClone(item));
226
+ for (const item of snapshot.tasks)
227
+ kernel.tasks.set(item.taskId, structuredClone(item));
228
+ for (const item of snapshot.responses)
229
+ kernel.responses.set(item.deliveryId, structuredClone(item));
230
+ for (const item of snapshot.inboundIndex)
231
+ kernel.inboundIndex.set(...item);
232
+ for (const item of snapshot.rawTail)
233
+ kernel.rawTail.set(item[0], structuredClone(item[1]));
234
+ Object.assign(kernel.counters, snapshot.counters);
235
+ return kernel;
236
+ }
237
+ guardVisibleResponse(obligation, text) {
238
+ if (TERMINAL.has(obligation.state))
239
+ throw new ContinuityError("Cannot respond to a terminal obligation.");
240
+ const normalized = text.trim().toLowerCase();
241
+ if (!normalized || GENERIC_RESETS.some((phrase) => normalized.includes(phrase))) {
242
+ throw new ContinuityError("A generic reset cannot replace an owed visible response.");
243
+ }
244
+ }
245
+ createResponse(obligation, responseKind, text, modality = obligation.modality) {
246
+ const deliveryId = this.nextId("delivery", "delivery");
247
+ const response = {
248
+ deliveryId,
249
+ conversationId: obligation.conversationId,
250
+ obligationId: obligation.obligationId,
251
+ responseKind,
252
+ text,
253
+ idempotencyKey: `${obligation.obligationId}:${obligation.revision}:${responseKind}`,
254
+ status: "PENDING",
255
+ ...(obligation.relationshipId ? { relationshipId: obligation.relationshipId } : {}),
256
+ ...(obligation.channelId ? { channelId: obligation.channelId } : {}),
257
+ modality,
258
+ interactionMode: modality === "voice" ? "sync" : obligation.interactionMode,
259
+ groundingState: "NOT_REQUIRED",
260
+ playbackCompleted: false,
261
+ interrupted: false,
262
+ };
263
+ this.responses.set(deliveryId, response);
264
+ return response;
265
+ }
266
+ appendEvent(conversationId, type, actorKind, payload) {
267
+ const event = { eventId: this.nextId("event", "evt"), sequence: this.counters.event, conversationId, type, actorKind, payload: structuredClone(payload) };
268
+ this.events.push(event);
269
+ return event;
270
+ }
271
+ nextId(counter, prefix) {
272
+ this.counters[counter] += 1;
273
+ return `${prefix}-${this.counters[counter]}`;
274
+ }
275
+ classify(text) {
276
+ const normalized = text.trim().toLowerCase();
277
+ if (/^(stop|cancel|never mind|nevermind)[.!]?$/.test(normalized))
278
+ return "cancellation";
279
+ if (/^(status|what'?s the status|how is it going|any update)[?!.]?$/.test(normalized))
280
+ return "status_query";
281
+ return "normal";
282
+ }
283
+ getObligation(id) {
284
+ const value = this.obligations.get(id);
285
+ if (!value)
286
+ throw new ContinuityError(`Unknown obligation: ${id}`);
287
+ return value;
288
+ }
289
+ getTask(id) {
290
+ const value = this.tasks.get(id);
291
+ if (!value)
292
+ throw new ContinuityError(`Unknown task: ${id}`);
293
+ return value;
294
+ }
295
+ getResponse(id) {
296
+ const value = this.responses.get(id);
297
+ if (!value)
298
+ throw new ContinuityError(`Unknown delivery: ${id}`);
299
+ return value;
300
+ }
301
+ }
302
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "duralogue",
3
+ "version": "0.1.0",
4
+ "description": "Durable obligations and delivery truth for conversational agents.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "Noah Ribaudo",
8
+ "files": ["dist", "README.md", "LICENSE"],
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "types": "./dist/index.d.ts",
16
+ "sideEffects": false,
17
+ "scripts": {
18
+ "build": "tsc -p tsconfig.build.json",
19
+ "test": "node --test test/*.test.ts",
20
+ "prepublishOnly": "npm test && npm run build"
21
+ },
22
+ "keywords": ["agents", "conversation", "durability", "reliability", "voice", "delivery"],
23
+ "devDependencies": {
24
+ "@types/node": "^22.0.0",
25
+ "typescript": "^5.7.0"
26
+ },
27
+ "engines": { "node": ">=20" }
28
+ }