@diegoaltoworks/talker 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.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +299 -0
  3. package/dist/adapters/twilio.d.ts +12 -0
  4. package/dist/adapters/twilio.d.ts.map +1 -0
  5. package/dist/core/chat.d.ts +14 -0
  6. package/dist/core/chat.d.ts.map +1 -0
  7. package/dist/core/chatbot/client.d.ts +12 -0
  8. package/dist/core/chatbot/client.d.ts.map +1 -0
  9. package/dist/core/chatbot/conversations.d.ts +14 -0
  10. package/dist/core/chatbot/conversations.d.ts.map +1 -0
  11. package/dist/core/chatbot/index.d.ts +9 -0
  12. package/dist/core/chatbot/index.d.ts.map +1 -0
  13. package/dist/core/chatbot/types.d.ts +25 -0
  14. package/dist/core/chatbot/types.d.ts.map +1 -0
  15. package/dist/core/context.d.ts +61 -0
  16. package/dist/core/context.d.ts.map +1 -0
  17. package/dist/core/context.test.d.ts +2 -0
  18. package/dist/core/context.test.d.ts.map +1 -0
  19. package/dist/core/errors.d.ts +8 -0
  20. package/dist/core/errors.d.ts.map +1 -0
  21. package/dist/core/errors.test.d.ts +2 -0
  22. package/dist/core/errors.test.d.ts.map +1 -0
  23. package/dist/core/logger.d.ts +11 -0
  24. package/dist/core/logger.d.ts.map +1 -0
  25. package/dist/core/phrases.d.ts +30 -0
  26. package/dist/core/phrases.d.ts.map +1 -0
  27. package/dist/core/phrases.test.d.ts +2 -0
  28. package/dist/core/phrases.test.d.ts.map +1 -0
  29. package/dist/core/processing/incoming.d.ts +12 -0
  30. package/dist/core/processing/incoming.d.ts.map +1 -0
  31. package/dist/core/processing/index.d.ts +10 -0
  32. package/dist/core/processing/index.d.ts.map +1 -0
  33. package/dist/core/processing/openai.d.ts +15 -0
  34. package/dist/core/processing/openai.d.ts.map +1 -0
  35. package/dist/core/processing/outgoing.d.ts +12 -0
  36. package/dist/core/processing/outgoing.d.ts.map +1 -0
  37. package/dist/core/processing/prompts.d.ts +14 -0
  38. package/dist/core/processing/prompts.d.ts.map +1 -0
  39. package/dist/core/twiml.d.ts +31 -0
  40. package/dist/core/twiml.d.ts.map +1 -0
  41. package/dist/core/twiml.test.d.ts +2 -0
  42. package/dist/core/twiml.test.d.ts.map +1 -0
  43. package/dist/core/voice.d.ts +16 -0
  44. package/dist/core/voice.d.ts.map +1 -0
  45. package/dist/core/voice.test.d.ts +2 -0
  46. package/dist/core/voice.test.d.ts.map +1 -0
  47. package/dist/core/xml.d.ts +8 -0
  48. package/dist/core/xml.d.ts.map +1 -0
  49. package/dist/core/xml.test.d.ts +2 -0
  50. package/dist/core/xml.test.d.ts.map +1 -0
  51. package/dist/db/client.d.ts +25 -0
  52. package/dist/db/client.d.ts.map +1 -0
  53. package/dist/db/index.d.ts +12 -0
  54. package/dist/db/index.d.ts.map +1 -0
  55. package/dist/db/migrate.d.ts +8 -0
  56. package/dist/db/migrate.d.ts.map +1 -0
  57. package/dist/db/persist.d.ts +18 -0
  58. package/dist/db/persist.d.ts.map +1 -0
  59. package/dist/db/sessions.d.ts +57 -0
  60. package/dist/db/sessions.d.ts.map +1 -0
  61. package/dist/flows/index.d.ts +12 -0
  62. package/dist/flows/index.d.ts.map +1 -0
  63. package/dist/flows/intent.d.ts +11 -0
  64. package/dist/flows/intent.d.ts.map +1 -0
  65. package/dist/flows/loader.d.ts +12 -0
  66. package/dist/flows/loader.d.ts.map +1 -0
  67. package/dist/flows/manager.d.ts +14 -0
  68. package/dist/flows/manager.d.ts.map +1 -0
  69. package/dist/flows/params.d.ts +12 -0
  70. package/dist/flows/params.d.ts.map +1 -0
  71. package/dist/flows/registry.d.ts +35 -0
  72. package/dist/flows/registry.d.ts.map +1 -0
  73. package/dist/flows/utils.d.ts +12 -0
  74. package/dist/flows/utils.d.ts.map +1 -0
  75. package/dist/flows/utils.test.d.ts +2 -0
  76. package/dist/flows/utils.test.d.ts.map +1 -0
  77. package/dist/index.d.ts +62 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +1840 -0
  80. package/dist/index.mjs +1771 -0
  81. package/dist/plugin.d.ts +31 -0
  82. package/dist/plugin.d.ts.map +1 -0
  83. package/dist/routes/call/handle-answer.d.ts +10 -0
  84. package/dist/routes/call/handle-answer.d.ts.map +1 -0
  85. package/dist/routes/call/handle-initial.d.ts +10 -0
  86. package/dist/routes/call/handle-initial.d.ts.map +1 -0
  87. package/dist/routes/call/handle-nospeech.d.ts +10 -0
  88. package/dist/routes/call/handle-nospeech.d.ts.map +1 -0
  89. package/dist/routes/call/handle-respond.d.ts +11 -0
  90. package/dist/routes/call/handle-respond.d.ts.map +1 -0
  91. package/dist/routes/call/handle-status.d.ts +9 -0
  92. package/dist/routes/call/handle-status.d.ts.map +1 -0
  93. package/dist/routes/call/index.d.ts +14 -0
  94. package/dist/routes/call/index.d.ts.map +1 -0
  95. package/dist/routes/call/pending.d.ts +20 -0
  96. package/dist/routes/call/pending.d.ts.map +1 -0
  97. package/dist/routes/call/processor.d.ts +13 -0
  98. package/dist/routes/call/processor.d.ts.map +1 -0
  99. package/dist/routes/sms/handle-incoming.d.ts +10 -0
  100. package/dist/routes/sms/handle-incoming.d.ts.map +1 -0
  101. package/dist/routes/sms/index.d.ts +13 -0
  102. package/dist/routes/sms/index.d.ts.map +1 -0
  103. package/dist/routes/sms/processor.d.ts +12 -0
  104. package/dist/routes/sms/processor.d.ts.map +1 -0
  105. package/dist/standalone.d.ts +44 -0
  106. package/dist/standalone.d.ts.map +1 -0
  107. package/dist/types.d.ts +240 -0
  108. package/dist/types.d.ts.map +1 -0
  109. package/language/de.json +27 -0
  110. package/language/en.json +27 -0
  111. package/language/es.json +27 -0
  112. package/language/fr.json +27 -0
  113. package/language/nl.json +27 -0
  114. package/language/pt.json +27 -0
  115. package/package.json +103 -0
  116. package/prompts/incoming.md +88 -0
  117. package/prompts/outgoing.md +58 -0
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Outgoing Response Processor
3
+ *
4
+ * Post-processes outgoing responses: channel-appropriate formatting
5
+ * (voice vs SMS), language translation, brevity enforcement.
6
+ */
7
+ import type { Channel, TalkerDependencies } from "../../types";
8
+ /**
9
+ * Post-process an outgoing response for the telephony channel
10
+ */
11
+ export declare function processOutgoing(deps: TalkerDependencies, phoneNumber: string, botResponse: string, channel?: Channel): Promise<string>;
12
+ //# sourceMappingURL=outgoing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outgoing.d.ts","sourceRoot":"","sources":["../../../src/core/processing/outgoing.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAO/D;;GAEG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,OAAgB,GACxB,OAAO,CAAC,MAAM,CAAC,CA8BjB"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Prompt Loader
3
+ *
4
+ * Loads and caches system prompts for the incoming/outgoing processing pipeline.
5
+ * Looks in custom paths first, then falls back to built-in prompts.
6
+ */
7
+ import type { TalkerDependencies } from "../../types";
8
+ export declare function getIncomingPrompt(deps: TalkerDependencies): string;
9
+ export declare function getOutgoingPrompt(deps: TalkerDependencies): string;
10
+ /**
11
+ * Reset prompt cache (for testing)
12
+ */
13
+ export declare function resetPromptCache(): void;
14
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/core/processing/prompts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAoBtD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAYlE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,CAWlE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAGvC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * TwiML Generation Utilities
3
+ *
4
+ * Generates Twilio Markup Language (TwiML) XML for voice and SMS responses.
5
+ */
6
+ import type { TalkerConfig } from "../types";
7
+ /**
8
+ * Generate TwiML for a speech gather with response
9
+ */
10
+ export declare function gatherTwiml(prompt: string, language: string, config: TalkerConfig, phoneNumber?: string): string;
11
+ /**
12
+ * Generate TwiML for a simple say
13
+ */
14
+ export declare function sayTwiml(message: string, language: string, config: TalkerConfig): string;
15
+ /**
16
+ * Generate TwiML for transferring to a human
17
+ */
18
+ export declare function transferTwiml(language: string, config: TalkerConfig): string;
19
+ /**
20
+ * Generate TwiML for the "one moment please" acknowledgment
21
+ */
22
+ export declare function acknowledgmentTwiml(language: string, config: TalkerConfig): string;
23
+ /**
24
+ * Generate TwiML for ending a call with a farewell
25
+ */
26
+ export declare function farewellTwiml(language: string, config: TalkerConfig): string;
27
+ /**
28
+ * Generate TwiML for an SMS response
29
+ */
30
+ export declare function messageTwiml(message: string): string;
31
+ //# sourceMappingURL=twiml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twiml.d.ts","sourceRoot":"","sources":["../../src/core/twiml.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAe,MAAM,UAAU,CAAC;AAM1D;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,YAAY,EACpB,WAAW,CAAC,EAAE,MAAM,GACnB,MAAM,CAeR;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAMxF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAS5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CASlF;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CAQ5E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMpD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=twiml.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twiml.test.d.ts","sourceRoot":"","sources":["../../src/core/twiml.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Voice configuration for different languages
3
+ *
4
+ * Maps language codes to TTS voice identifiers and BCP-47 language tags.
5
+ * Default configuration uses Amazon Polly voices via Twilio.
6
+ */
7
+ import type { VoiceConfig } from "../types";
8
+ /**
9
+ * Get voice configuration for a language, with optional custom overrides
10
+ */
11
+ export declare function getVoiceConfig(language: string, customVoices?: Record<string, VoiceConfig>): VoiceConfig;
12
+ /**
13
+ * Get the default voice map (useful for consumers who want to extend it)
14
+ */
15
+ export declare function getDefaultVoices(): Record<string, VoiceConfig>;
16
+ //# sourceMappingURL=voice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.d.ts","sourceRoot":"","sources":["../../src/core/voice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAa5C;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GACzC,WAAW,CAKb;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAE9D"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=voice.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice.test.d.ts","sourceRoot":"","sources":["../../src/core/voice.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * XML utility functions
3
+ */
4
+ /**
5
+ * Escape special XML characters for safe TwiML embedding
6
+ */
7
+ export declare function escapeXml(text: string): string;
8
+ //# sourceMappingURL=xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../src/core/xml.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM9C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=xml.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xml.test.d.ts","sourceRoot":"","sources":["../../src/core/xml.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Database Client
3
+ *
4
+ * Lazy-initialized Turso/libSQL client.
5
+ * Returns null when not configured — all callers handle this gracefully.
6
+ */
7
+ import { type Client } from "@libsql/client";
8
+ /**
9
+ * Initialize the database client from config.
10
+ * Called once during setup; subsequent calls to getDbClient() return the cached client.
11
+ */
12
+ export declare function initDbClient(url: string, authToken: string): void;
13
+ /**
14
+ * Set the database client directly (for testing with mock/in-memory clients).
15
+ */
16
+ export declare function setDbClient(mockClient: Client | null): void;
17
+ /**
18
+ * Get the database client. Returns null if not configured.
19
+ */
20
+ export declare function getDbClient(): Client | null;
21
+ /**
22
+ * Close the database client.
23
+ */
24
+ export declare function closeDbClient(): Promise<void>;
25
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/db/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,gBAAgB,CAAC;AAK3D;;;GAGG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAajE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAE3D;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,GAAG,IAAI,CAE3C;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAYnD"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Database Module
3
+ *
4
+ * Optional session persistence to Turso/libSQL.
5
+ * Activates when database.url and database.authToken are provided in config.
6
+ */
7
+ export { closeDbClient, getDbClient, initDbClient } from "./client";
8
+ export { runMigrations } from "./migrate";
9
+ export { persistFinalSession, persistSession } from "./persist";
10
+ export { generateId, generateSessionId, insertMessage, saveSessionWithMessages, updateSessionIncremental, upsertSession, } from "./sessions";
11
+ export type { MessageRecord, SessionRecord } from "./sessions";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EACL,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,uBAAuB,EACvB,wBAAwB,EACxB,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Database Migrations
3
+ *
4
+ * Runs the schema.sql against the configured database.
5
+ * Safe to run multiple times (uses IF NOT EXISTS).
6
+ */
7
+ export declare function runMigrations(): Promise<void>;
8
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAiCnD"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Session Persistence Helpers
3
+ *
4
+ * Non-blocking helpers that save conversation state to the database.
5
+ * Safe to call when database is not configured — gracefully no-ops.
6
+ */
7
+ import type { Channel } from "../types";
8
+ /**
9
+ * Persist the current conversation state to the database.
10
+ * Non-blocking — fires and forgets. Logs errors but never throws.
11
+ */
12
+ export declare function persistSession(phoneNumber: string, channel: Channel, conversationId?: string): void;
13
+ /**
14
+ * Persist the final session state when a call completes.
15
+ * Sets the reason and optional transfer reason.
16
+ */
17
+ export declare function persistFinalSession(phoneNumber: string, channel: Channel, reason: "ended" | "redirected", transferReason?: string): void;
18
+ //# sourceMappingURL=persist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persist.d.ts","sourceRoot":"","sources":["../../src/db/persist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAIxC;;;GAGG;AACH,wBAAgB,cAAc,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,cAAc,CAAC,EAAE,MAAM,GACtB,IAAI,CAsCN;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,OAAO,GAAG,YAAY,EAC9B,cAAc,CAAC,EAAE,MAAM,GACtB,IAAI,CA2BN"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Session Persistence
3
+ *
4
+ * Saves telephony sessions and messages to talker_sessions / talker_messages.
5
+ * All operations are graceful — they return false/skip when the database is not configured.
6
+ */
7
+ import type { Channel } from "../types";
8
+ export interface SessionRecord {
9
+ id: string;
10
+ phoneNumber: string;
11
+ channel: Channel;
12
+ reason: "ended" | "redirected";
13
+ language: string;
14
+ startedAt: number;
15
+ endedAt: number;
16
+ durationMs: number;
17
+ transferReason?: string;
18
+ conversationId?: string;
19
+ }
20
+ export interface MessageRecord {
21
+ id: string;
22
+ sessionId: string;
23
+ role: "user" | "assistant";
24
+ content: string;
25
+ timestamp: number;
26
+ }
27
+ declare function generateId(): string;
28
+ export declare function generateSessionId(phoneNumber: string, startTime: number): string;
29
+ /**
30
+ * Upsert a session (insert or update)
31
+ */
32
+ export declare function upsertSession(session: SessionRecord): Promise<boolean>;
33
+ /**
34
+ * Insert a single message (idempotent — skips duplicates)
35
+ */
36
+ export declare function insertMessage(message: MessageRecord): Promise<boolean>;
37
+ /**
38
+ * Save session and messages in one go
39
+ */
40
+ export declare function saveSessionWithMessages(session: SessionRecord, messages: Array<{
41
+ role: "user" | "assistant";
42
+ content: string;
43
+ timestamp: number;
44
+ }>): Promise<boolean>;
45
+ /**
46
+ * Update session incrementally after each interaction.
47
+ * Called non-blocking after every call/sms exchange.
48
+ */
49
+ export declare function updateSessionIncremental(phoneNumber: string, channel: Channel, context: {
50
+ createdAt: number;
51
+ }, language: string, messages: Array<{
52
+ role: "user" | "assistant";
53
+ content: string;
54
+ timestamp: number;
55
+ }>, conversationId?: string): Promise<boolean>;
56
+ export { generateId };
57
+ //# sourceMappingURL=sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/db/sessions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,UAAU,CAAC;AAGxC,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,GAAG,YAAY,CAAC;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,iBAAS,UAAU,IAAI,MAAM,CAE5B;AAED,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAGhF;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAiD5E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAkB5E;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,aAAa,EACtB,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GAClF,OAAO,CAAC,OAAO,CAAC,CAgBlB;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAC5C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,EAC9B,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,EACnF,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,CAAC,CAwClB;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Flow Engine
3
+ *
4
+ * Re-exports flow system components.
5
+ */
6
+ export { FlowRegistry } from "./registry";
7
+ export { processFlow, shouldExitFlow } from "./manager";
8
+ export { loadFlowsFromDirectory } from "./loader";
9
+ export { detectIntent } from "./intent";
10
+ export { extractParameters } from "./params";
11
+ export { getExitMessage } from "./utils";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/flows/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * LLM-powered Intent Detection
3
+ *
4
+ * Classifies user messages into flow intents using OpenAI.
5
+ */
6
+ import type { IntentDetection, LoadedFlow, TalkerDependencies } from "../types";
7
+ /**
8
+ * Detect user intent using LLM
9
+ */
10
+ export declare function detectIntent(deps: TalkerDependencies, phoneNumber: string, userMessage: string, flows: Map<string, LoadedFlow>, conversationContext?: string[]): Promise<IntentDetection>;
11
+ //# sourceMappingURL=intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/flows/intent.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIhF;;GAEG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,EAC9B,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,eAAe,CAAC,CAmG1B"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Dynamic Flow Loader
3
+ *
4
+ * Discovers and loads flow definitions from the filesystem.
5
+ * Each flow is a directory containing: flow.json, handler.ts, instructions.md
6
+ */
7
+ import type { LoadedFlow } from "../types";
8
+ /**
9
+ * Load all flows from a directory
10
+ */
11
+ export declare function loadFlowsFromDirectory(flowsDir: string): Promise<Map<string, LoadedFlow>>;
12
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/flows/loader.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAA4C,UAAU,EAAE,MAAM,UAAU,CAAC;AAErF;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CA8B/F"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Flow Manager
3
+ *
4
+ * Orchestrates the flow lifecycle: triggering, parameter collection,
5
+ * execution, and cleanup.
6
+ */
7
+ import type { Channel, FlowResult, TalkerDependencies } from "../types";
8
+ import type { FlowRegistry } from "./registry";
9
+ export { shouldExitFlow } from "./utils";
10
+ /**
11
+ * Process a flow for a user message
12
+ */
13
+ export declare function processFlow(deps: TalkerDependencies, registry: FlowRegistry, phoneNumber: string, userMessage: string, channel: Channel): Promise<FlowResult>;
14
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/flows/manager.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAExE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAEzC;;GAEG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,kBAAkB,EACxB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,UAAU,CAAC,CAgJrB"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Parameter Extraction
3
+ *
4
+ * Uses OpenAI to extract structured parameters from user messages
5
+ * based on flow schema definitions.
6
+ */
7
+ import type { FlowExtractionResult, LoadedFlow, TalkerDependencies } from "../types";
8
+ /**
9
+ * Extract parameters from user message using OpenAI
10
+ */
11
+ export declare function extractParameters(deps: TalkerDependencies, flow: LoadedFlow, phoneNumber: string, userMessage: string, existingParams: Record<string, unknown>): Promise<FlowExtractionResult>;
12
+ //# sourceMappingURL=params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"params.d.ts","sourceRoot":"","sources":["../../src/flows/params.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,oBAAoB,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAIrF;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,kBAAkB,EACxB,IAAI,EAAE,UAAU,EAChB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACtC,OAAO,CAAC,oBAAoB,CAAC,CA2I/B"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Flow Registry
3
+ *
4
+ * Central registry for loaded flows. Provides flow lookup, intent matching,
5
+ * and instruction loading.
6
+ */
7
+ import type { LoadedFlow, TalkerDependencies } from "../types";
8
+ export declare class FlowRegistry {
9
+ private flows;
10
+ private flowsDir;
11
+ constructor(flowsDir: string);
12
+ /**
13
+ * Load all flows from the flows directory
14
+ */
15
+ loadFlows(): Promise<void>;
16
+ /**
17
+ * Get a flow by name
18
+ */
19
+ getFlow(name: string): LoadedFlow | undefined;
20
+ /**
21
+ * Match user message to a flow using hybrid approach:
22
+ * 1. Critical keyword detection (immediate)
23
+ * 2. LLM intent classification
24
+ */
25
+ matchFlow(deps: TalkerDependencies, phoneNumber: string, message: string, conversationContext?: string[]): Promise<LoadedFlow | undefined>;
26
+ /**
27
+ * Get all loaded flows
28
+ */
29
+ getAllFlows(): LoadedFlow[];
30
+ /**
31
+ * Get flow instructions content
32
+ */
33
+ getInstructions(flowName: string): string;
34
+ }
35
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/flows/registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAM/D,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAiC;IAC9C,OAAO,CAAC,QAAQ,CAAS;gBAEb,QAAQ,EAAE,MAAM;IAI5B;;OAEG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAI7C;;;;OAIG;IACG,SAAS,CACb,IAAI,EAAE,kBAAkB,EACxB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,mBAAmB,CAAC,EAAE,MAAM,EAAE,GAC7B,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC;IAyClC;;OAEG;IACH,WAAW,IAAI,UAAU,EAAE;IAI3B;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAO1C"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Flow utility functions
3
+ */
4
+ /**
5
+ * Check if user wants to exit the current flow
6
+ */
7
+ export declare function shouldExitFlow(message: string): boolean;
8
+ /**
9
+ * Get exit message for a specific language
10
+ */
11
+ export declare function getExitMessage(language: string, languageDir?: string): string;
12
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/flows/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAE7E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=utils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.test.d.ts","sourceRoot":"","sources":["../../src/flows/utils.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Talker — Telephony Plugin for Chatter
3
+ *
4
+ * Adds voice call and SMS support to Chatter chatbots via Twilio.
5
+ * Can also run as a standalone telephony server with a custom chatFn.
6
+ *
7
+ * ## Usage as Chatter Plugin
8
+ *
9
+ * ```typescript
10
+ * import { createServer } from "@diegoaltoworks/chatter";
11
+ * import { createTelephonyRoutes } from "@diegoaltoworks/talker";
12
+ *
13
+ * const app = await createServer({
14
+ * ...chatterConfig,
15
+ * customRoutes: (app, deps) => {
16
+ * createTelephonyRoutes(app, deps, {
17
+ * twilio: { accountSid, authToken, phoneNumber },
18
+ * transferNumber: "+44...",
19
+ * });
20
+ * },
21
+ * });
22
+ * ```
23
+ *
24
+ * ## Usage as Standalone Server
25
+ *
26
+ * ```typescript
27
+ * import { createStandaloneServer } from "@diegoaltoworks/talker";
28
+ *
29
+ * const app = await createStandaloneServer({
30
+ * openaiApiKey: process.env.OPENAI_API_KEY!,
31
+ * chatFn: async (phone, msg) => myBot.reply(msg),
32
+ * });
33
+ *
34
+ * Bun.serve({ port: 3000, fetch: app.fetch });
35
+ * ```
36
+ *
37
+ * @packageDocumentation
38
+ */
39
+ export { createTelephonyRoutes } from "./plugin";
40
+ export { createStandaloneServer } from "./standalone";
41
+ export type { StandaloneConfig } from "./standalone";
42
+ export type { TalkerConfig, TalkerDependencies, TelephonyFeatureFlags, TwilioConfig, ChatbotConfig, ProcessingConfig, Channel, VoiceConfig, IncomingResult, TelephonyContext, Phrases, } from "./types";
43
+ export type { FlowDefinition, FlowSchema, FlowSchemaProperty, FlowState, FlowHandler, FlowHandlerResult, FlowHandlerContext, FlowPrefill, FlowExtractionResult, FlowResult, IntentDetection, LoadedFlow, } from "./types";
44
+ export { processIncoming, processOutgoing } from "./core/processing";
45
+ export { getVoiceConfig, getDefaultVoices } from "./core/voice";
46
+ export { escapeXml } from "./core/xml";
47
+ export { getPhrase, getFarewellPhrase, getFlowPhrase, getSmsPhrase, loadPhrases, } from "./core/phrases";
48
+ export { getOrCreateContext, getContext, clearContext, clearAllContexts, setDetectedLanguage, getDetectedLanguage, addMessage, getMessageHistory, setActiveFlow, getActiveFlow, updateFlowParams, clearActiveFlow, incrementNoSpeechRetries, resetNoSpeechRetries, getLastPrompt, setLastPrompt, startCleanup, stopCleanup, } from "./core/context";
49
+ export { gatherTwiml, sayTwiml, transferTwiml, acknowledgmentTwiml, farewellTwiml, messageTwiml, } from "./core/twiml";
50
+ export { FlowRegistry } from "./flows/registry";
51
+ export { processFlow, shouldExitFlow } from "./flows/manager";
52
+ export { loadFlowsFromDirectory } from "./flows/loader";
53
+ export { getExitMessage } from "./flows/utils";
54
+ export { sendSMS } from "./adapters/twilio";
55
+ export { initDbClient, getDbClient, closeDbClient } from "./db/client";
56
+ export { runMigrations } from "./db/migrate";
57
+ export { persistFinalSession, persistSession } from "./db/persist";
58
+ export type { SessionRecord, MessageRecord } from "./db/sessions";
59
+ export { callRoutes } from "./routes/call";
60
+ export { smsRoutes } from "./routes/sms";
61
+ export { logger } from "./core/logger";
62
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAGH,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,YAAY,EACZ,aAAa,EACb,gBAAgB,EAChB,OAAO,EACP,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,OAAO,GACR,MAAM,SAAS,CAAC;AAGjB,YAAY,EACV,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,iBAAiB,EACjB,kBAAkB,EAClB,WAAW,EACX,oBAAoB,EACpB,UAAU,EACV,eAAe,EACf,UAAU,GACX,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EACL,SAAS,EACT,iBAAiB,EACjB,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACnB,UAAU,EACV,iBAAiB,EACjB,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,wBAAwB,EACxB,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,GACZ,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,WAAW,EACX,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,YAAY,GACb,MAAM,cAAc,CAAC;AAGtB,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAG5C,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGlE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}