@onkeiki/agents 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 (111) hide show
  1. package/dist/Alert.d.ts +56 -0
  2. package/dist/Alert.d.ts.map +1 -0
  3. package/dist/Alert.js +8 -0
  4. package/dist/Alert.js.map +1 -0
  5. package/dist/Entity.d.ts +158 -0
  6. package/dist/Entity.d.ts.map +1 -0
  7. package/dist/Entity.js +289 -0
  8. package/dist/Entity.js.map +1 -0
  9. package/dist/Kit.d.ts +138 -0
  10. package/dist/Kit.d.ts.map +1 -0
  11. package/dist/Kit.js +517 -0
  12. package/dist/Kit.js.map +1 -0
  13. package/dist/OpenApi.d.ts +151 -0
  14. package/dist/OpenApi.d.ts.map +1 -0
  15. package/dist/OpenApi.js +222 -0
  16. package/dist/OpenApi.js.map +1 -0
  17. package/dist/Plugin.d.ts +183 -0
  18. package/dist/Plugin.d.ts.map +1 -0
  19. package/dist/Plugin.js +10 -0
  20. package/dist/Plugin.js.map +1 -0
  21. package/dist/Server.d.ts +71 -0
  22. package/dist/Server.d.ts.map +1 -0
  23. package/dist/Server.js +476 -0
  24. package/dist/Server.js.map +1 -0
  25. package/dist/Tool.d.ts +86 -0
  26. package/dist/Tool.d.ts.map +1 -0
  27. package/dist/Tool.js +27 -0
  28. package/dist/Tool.js.map +1 -0
  29. package/dist/bundle.d.ts +17 -0
  30. package/dist/bundle.d.ts.map +1 -0
  31. package/dist/bundle.js +101 -0
  32. package/dist/bundle.js.map +1 -0
  33. package/dist/index.d.ts +19 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +18 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/services/Blackboard.d.ts +18 -0
  38. package/dist/services/Blackboard.d.ts.map +1 -0
  39. package/dist/services/Blackboard.js +4 -0
  40. package/dist/services/Blackboard.js.map +1 -0
  41. package/dist/services/Observability.d.ts +102 -0
  42. package/dist/services/Observability.d.ts.map +1 -0
  43. package/dist/services/Observability.js +238 -0
  44. package/dist/services/Observability.js.map +1 -0
  45. package/dist/services/Platform.d.ts +112 -0
  46. package/dist/services/Platform.d.ts.map +1 -0
  47. package/dist/services/Platform.js +13 -0
  48. package/dist/services/Platform.js.map +1 -0
  49. package/dist/services/PluginDb.d.ts +44 -0
  50. package/dist/services/PluginDb.d.ts.map +1 -0
  51. package/dist/services/PluginDb.js +5 -0
  52. package/dist/services/PluginDb.js.map +1 -0
  53. package/dist/services/Sandbox.d.ts +68 -0
  54. package/dist/services/Sandbox.d.ts.map +1 -0
  55. package/dist/services/Sandbox.js +4 -0
  56. package/dist/services/Sandbox.js.map +1 -0
  57. package/dist/services/Steering.d.ts +46 -0
  58. package/dist/services/Steering.d.ts.map +1 -0
  59. package/dist/services/Steering.js +4 -0
  60. package/dist/services/Steering.js.map +1 -0
  61. package/dist/services/Storage.d.ts +63 -0
  62. package/dist/services/Storage.d.ts.map +1 -0
  63. package/dist/services/Storage.js +13 -0
  64. package/dist/services/Storage.js.map +1 -0
  65. package/dist/services/Transport.d.ts +19 -0
  66. package/dist/services/Transport.d.ts.map +1 -0
  67. package/dist/services/Transport.js +4 -0
  68. package/dist/services/Transport.js.map +1 -0
  69. package/dist/services/index.d.ts +9 -0
  70. package/dist/services/index.d.ts.map +1 -0
  71. package/dist/services/index.js +9 -0
  72. package/dist/services/index.js.map +1 -0
  73. package/dist/types/config.d.ts +526 -0
  74. package/dist/types/config.d.ts.map +1 -0
  75. package/dist/types/config.js +2 -0
  76. package/dist/types/config.js.map +1 -0
  77. package/dist/types/index.d.ts +4 -0
  78. package/dist/types/index.d.ts.map +1 -0
  79. package/dist/types/index.js +4 -0
  80. package/dist/types/index.js.map +1 -0
  81. package/dist/types/message.d.ts +54 -0
  82. package/dist/types/message.d.ts.map +1 -0
  83. package/dist/types/message.js +47 -0
  84. package/dist/types/message.js.map +1 -0
  85. package/dist/types/user.d.ts +16 -0
  86. package/dist/types/user.d.ts.map +1 -0
  87. package/dist/types/user.js +14 -0
  88. package/dist/types/user.js.map +1 -0
  89. package/package.json +39 -0
  90. package/src/Alert.ts +51 -0
  91. package/src/Entity.ts +543 -0
  92. package/src/Kit.ts +705 -0
  93. package/src/OpenApi.ts +343 -0
  94. package/src/Plugin.ts +209 -0
  95. package/src/Server.ts +618 -0
  96. package/src/Tool.ts +110 -0
  97. package/src/bundle.ts +114 -0
  98. package/src/index.ts +209 -0
  99. package/src/services/Blackboard.ts +19 -0
  100. package/src/services/Observability.ts +320 -0
  101. package/src/services/Platform.ts +125 -0
  102. package/src/services/PluginDb.ts +48 -0
  103. package/src/services/Sandbox.ts +74 -0
  104. package/src/services/Steering.ts +45 -0
  105. package/src/services/Storage.ts +76 -0
  106. package/src/services/Transport.ts +21 -0
  107. package/src/services/index.ts +8 -0
  108. package/src/types/config.ts +531 -0
  109. package/src/types/index.ts +3 -0
  110. package/src/types/message.ts +60 -0
  111. package/src/types/user.ts +17 -0
@@ -0,0 +1,71 @@
1
+ import type { AgentKitConfig } from './types/config.js';
2
+ import type { InboundMessage } from './types/index.js';
3
+ import type { AlertMedia, AlertDefinition } from './Alert.js';
4
+ import { type ResolvedPlugins } from './Kit.js';
5
+ import type { PluginDbService } from './services/PluginDb.js';
6
+ /**
7
+ * HTTP server that receives turn requests from the Orchid platform.
8
+ *
9
+ * Routes:
10
+ * - POST /turn — Platform sends inbound messages for processing
11
+ * - POST /delivery — Platform proxies delivery status webhooks
12
+ * - POST /events/:type — Platform proxies event webhooks
13
+ * - GET /health — Health check
14
+ * - ...plugin routes — Contributed by plugins
15
+ */
16
+ export type TurnRequest = {
17
+ readonly message: InboundMessage;
18
+ readonly context: {
19
+ readonly memories: ReadonlyArray<{
20
+ content: string;
21
+ category: string;
22
+ }>;
23
+ readonly history: ReadonlyArray<{
24
+ content: string;
25
+ direction: 'inbound' | 'outbound';
26
+ }>;
27
+ };
28
+ };
29
+ export type TurnResponse = {
30
+ readonly reply: string;
31
+ readonly media?: {
32
+ url: string;
33
+ mimeType: string;
34
+ };
35
+ readonly toolCalls?: ReadonlyArray<{
36
+ name: string;
37
+ input: unknown;
38
+ output: unknown;
39
+ }>;
40
+ readonly shouldLearn?: boolean;
41
+ };
42
+ /** One outbound message produced by an alert run, as returned to the platform. */
43
+ export type AlertDelivery = {
44
+ readonly phone: string;
45
+ readonly text: string;
46
+ readonly media?: AlertMedia;
47
+ /** Recipient-scoped claim key: the platform skips a delivery whose key was already claimed. */
48
+ readonly dedupKey?: string;
49
+ };
50
+ export declare function createServer(config: AgentKitConfig, resolved: ResolvedPlugins): {
51
+ fetch: (req: Request) => Promise<Response>;
52
+ };
53
+ export type AlertExecuteBody = {
54
+ alertName: string;
55
+ subscribers: Array<{
56
+ phone: string;
57
+ preferences?: Record<string, unknown>;
58
+ }>;
59
+ secrets?: Record<string, string>;
60
+ };
61
+ /**
62
+ * Run one alert against its subscribers and flatten the results into ordered
63
+ * {@link AlertDelivery} entries. Shared by the built-in `/alerts/execute`
64
+ * route and the alerts plugin, so the two paths cannot diverge.
65
+ */
66
+ export declare function executeAlert(alert: AlertDefinition, body: AlertExecuteBody, pluginDb?: PluginDbService): Promise<{
67
+ sent: number;
68
+ skipped: number;
69
+ deliveries: AlertDelivery[];
70
+ }>;
71
+ //# sourceMappingURL=Server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Server.d.ts","sourceRoot":"","sources":["../src/Server.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AACvD,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,kBAAkB,CAAA;AAEtE,OAAO,KAAK,EAAmC,UAAU,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE9F,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,UAAU,CAAA;AAE7D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAI7D;;;;;;;;;GASG;AAEH,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC,CAAA;QACvE,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,SAAS,GAAG,UAAU,CAAA;SAAE,CAAC,CAAA;KACxF,CAAA;CACF,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;IAClD,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IACrF,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAC/B,CAAA;AAED,kFAAkF;AAClF,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAA;IAC3B,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,eAAe;IAI1E,KAAK,QAAc,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;EA2DjD;AAuED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,KAAK,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC,CAAA;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACjC,CAAA;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,gBAAgB,EACtB,QAAQ,CAAC,EAAE,eAAe,GACzB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,aAAa,EAAE,CAAA;CAAE,CAAC,CAmDzE"}
package/dist/Server.js ADDED
@@ -0,0 +1,476 @@
1
+ import { Effect, Schema, JSONSchema } from 'effect';
2
+ import { mergedAlerts } from './Kit.js';
3
+ import { StorageError } from './services/Storage.js';
4
+ export function createServer(config, resolved) {
5
+ const routeCtx = { config, request: null };
6
+ return {
7
+ fetch: async (req) => {
8
+ // Run plugin onRequest interceptors
9
+ for (const onReq of resolved.onRequest) {
10
+ const result = await Effect.runPromise(onReq(req).pipe(Effect.orDie));
11
+ if (result instanceof Response)
12
+ return result;
13
+ if (result instanceof Request)
14
+ req = result;
15
+ }
16
+ // Run plugin middleware
17
+ for (const mw of resolved.middleware) {
18
+ const url = new URL(req.url);
19
+ if (url.pathname.startsWith(mw.path)) {
20
+ const mwResult = await Effect.runPromise(mw.handler(req, { ...routeCtx, request: req }).pipe(Effect.orDie));
21
+ if (mwResult instanceof Response)
22
+ return mwResult;
23
+ }
24
+ }
25
+ const url = new URL(req.url);
26
+ // Check plugin routes first
27
+ const pluginRoute = resolved.routes[url.pathname];
28
+ if (pluginRoute) {
29
+ const response = await pluginRoute(req, { ...routeCtx, request: req });
30
+ return applyOnResponse(response, resolved);
31
+ }
32
+ let response;
33
+ switch (url.pathname) {
34
+ case '/health':
35
+ response = new Response(JSON.stringify({ status: 'ok', version: '0.1.0' }), {
36
+ headers: { 'Content-Type': 'application/json' },
37
+ });
38
+ break;
39
+ case '/turn':
40
+ response = await handleTurn(req, config, resolved);
41
+ break;
42
+ case '/alerts/execute':
43
+ response = await handleAlertExecute(req, config, resolved);
44
+ break;
45
+ case '/delivery':
46
+ response = await handleDelivery(req, config);
47
+ break;
48
+ default:
49
+ if (url.pathname.startsWith('/events/')) {
50
+ response = await handleEvent(req, config, url.pathname.slice(8));
51
+ }
52
+ else {
53
+ response = new Response('Not found', { status: 404 });
54
+ }
55
+ }
56
+ return applyOnResponse(response, resolved);
57
+ },
58
+ };
59
+ }
60
+ async function applyOnResponse(res, resolved) {
61
+ for (const onRes of resolved.onResponse) {
62
+ res = await Effect.runPromise(onRes(res).pipe(Effect.orDie));
63
+ }
64
+ return res;
65
+ }
66
+ async function handleTurn(req, config, resolved) {
67
+ const authHeader = req.headers.get('Authorization');
68
+ const isPlatformForward = req.headers.get('X-Orchid-Platform') === 'true';
69
+ if (!isPlatformForward && (!authHeader?.startsWith('Bearer ') || authHeader.slice(7) !== config.apiKey)) {
70
+ return new Response('Unauthorized', { status: 401 });
71
+ }
72
+ const body = (await req.json());
73
+ // Run beforeTurn hooks
74
+ let turnEvent = {
75
+ phone: body.message.phone,
76
+ messages: [
77
+ ...body.context.history.map((h) => ({ content: h.content, direction: h.direction })),
78
+ { content: body.message.text, direction: 'inbound' },
79
+ ],
80
+ context: {},
81
+ };
82
+ for (const hook of resolved.hooks.beforeTurn) {
83
+ turnEvent = await Effect.runPromise(hook(turnEvent).pipe(Effect.orDie));
84
+ }
85
+ const startTime = Date.now();
86
+ const result = await Effect.runPromise(runAgentTurn(config, body, resolved));
87
+ // Run afterTurn hooks
88
+ const turnResult = {
89
+ phone: body.message.phone,
90
+ response: result.reply,
91
+ toolCalls: result.toolCalls ?? [],
92
+ tokensUsed: { in: result.tokensIn ?? 0, out: result.tokensOut ?? 0 },
93
+ durationMs: Date.now() - startTime,
94
+ };
95
+ for (const hook of resolved.hooks.afterTurn) {
96
+ await Effect.runPromise(hook(turnResult).pipe(Effect.orDie));
97
+ }
98
+ return new Response(JSON.stringify(result), {
99
+ headers: { 'Content-Type': 'application/json' },
100
+ });
101
+ }
102
+ async function handleAlertExecute(req, config, resolved) {
103
+ const isPlatformForward = req.headers.get('X-Orchid-Platform') === 'true';
104
+ if (!isPlatformForward)
105
+ return new Response('Unauthorized', { status: 401 });
106
+ const body = await req.json();
107
+ const alert = mergedAlerts(config, resolved).find((a) => a.name === body.alertName);
108
+ if (!alert)
109
+ return new Response(`Alert not found: ${body.alertName}`, { status: 404 });
110
+ const pluginDb = config.storage && 'pluginDb' in config.storage ? config.storage.pluginDb : undefined;
111
+ const result = await executeAlert(alert, body, pluginDb);
112
+ return new Response(JSON.stringify(result), {
113
+ headers: { 'Content-Type': 'application/json' },
114
+ });
115
+ }
116
+ /**
117
+ * Run one alert against its subscribers and flatten the results into ordered
118
+ * {@link AlertDelivery} entries. Shared by the built-in `/alerts/execute`
119
+ * route and the alerts plugin, so the two paths cannot diverge.
120
+ */
121
+ export async function executeAlert(alert, body, pluginDb) {
122
+ let sent = 0;
123
+ let skipped = 0;
124
+ const deliveries = [];
125
+ for (const subscriber of body.subscribers ?? []) {
126
+ const ctx = {
127
+ subscriber: {
128
+ phone: subscriber.phone,
129
+ chatId: `sdk-alert:${subscriber.phone}`,
130
+ preferences: subscriber.preferences ?? {},
131
+ },
132
+ now: new Date(),
133
+ secrets: body.secrets ?? {},
134
+ state: makeAlertState(pluginDb, body.alertName, subscriber.phone),
135
+ };
136
+ const ok = alert.shouldSend ? await Effect.runPromise(alert.shouldSend(ctx)) : true;
137
+ if (!ok) {
138
+ skipped++;
139
+ continue;
140
+ }
141
+ const content = await Effect.runPromise(alert.generate(ctx));
142
+ if (!content || (!content.text && !content.media && !(content.messages?.length))) {
143
+ skipped++;
144
+ continue;
145
+ }
146
+ sent++;
147
+ const subscriberDeliveries = [];
148
+ if (content.text || content.media) {
149
+ subscriberDeliveries.push({ phone: subscriber.phone, text: content.text, media: content.media });
150
+ }
151
+ for (const extra of content.messages ?? []) {
152
+ if (!extra.text && !(extra.media?.length))
153
+ continue;
154
+ subscriberDeliveries.push({ phone: subscriber.phone, text: extra.text, media: extra.media?.[0] });
155
+ for (const m of extra.media?.slice(1) ?? []) {
156
+ subscriberDeliveries.push({ phone: subscriber.phone, text: '', media: m });
157
+ }
158
+ }
159
+ // The claim key rides on the first delivery that will actually be sent,
160
+ // so a content shape with an empty primary message still gets claimed.
161
+ const dedupKey = alert.dedupKey?.(ctx);
162
+ if (dedupKey && subscriberDeliveries[0]) {
163
+ subscriberDeliveries[0] = { ...subscriberDeliveries[0], dedupKey };
164
+ }
165
+ deliveries.push(...subscriberDeliveries);
166
+ }
167
+ return { sent, skipped, deliveries };
168
+ }
169
+ async function handleDelivery(req, config) {
170
+ const body = (await req.json());
171
+ if (config.events?.onDeliveryStatus) {
172
+ await Effect.runPromise(config.events.onDeliveryStatus(body));
173
+ }
174
+ return new Response('ok');
175
+ }
176
+ async function handleEvent(req, config, eventType) {
177
+ const body = await req.json();
178
+ switch (eventType) {
179
+ case 'new-user':
180
+ if (config.events?.onNewUser) {
181
+ await Effect.runPromise(config.events.onNewUser(body));
182
+ }
183
+ break;
184
+ case 'opt-out':
185
+ if (config.events?.onOptOut) {
186
+ await Effect.runPromise(config.events.onOptOut(body));
187
+ }
188
+ break;
189
+ }
190
+ return new Response('ok');
191
+ }
192
+ const OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY ?? '';
193
+ const OPENROUTER_BASE_URL = 'https://openrouter.ai/api/v1';
194
+ /** Most reply-review rejections ({@link TurnHooks.reviewReply}) honored per turn. */
195
+ const MAX_REPLY_REVIEW_RETRIES = 2;
196
+ function runAgentTurn(config, turn, resolved) {
197
+ return Effect.tryPromise({
198
+ try: async () => {
199
+ const promptCtx = {
200
+ user: { phone: turn.message.phone, timezone: null, currency: null, metadata: {}, firstSeenAt: new Date() },
201
+ now: new Date(),
202
+ phone: turn.message.phone,
203
+ context: {
204
+ memorySummary: turn.context.memories.map((m) => `[${m.category}] ${m.content}`).join('\n') || null,
205
+ relevantFacts: turn.context.memories.map((m) => ({ fact: m.content, category: m.category })),
206
+ },
207
+ isFirstInteraction: turn.context.history.length === 0,
208
+ history: turn.context.history,
209
+ };
210
+ const hooks = config.agent.hooks;
211
+ const finishReply = (reply) => hooks?.transformReply ? hooks.transformReply(reply, promptCtx) : reply;
212
+ const systemPrompt = config.agent.systemPrompt(promptCtx);
213
+ // Merge agent tools + plugin tools
214
+ const allTools = [...config.agent.tools, ...resolved.tools];
215
+ // Convert SDK tools to OpenAI format
216
+ const openaiTools = allTools.map((t) => ({
217
+ type: 'function',
218
+ function: {
219
+ name: t.name,
220
+ description: t.description,
221
+ parameters: JSONSchema.make(t.input),
222
+ },
223
+ }));
224
+ // Build LLM messages
225
+ const llmMessages = [
226
+ { role: 'system', content: systemPrompt },
227
+ ...turn.context.history.map((h) => ({
228
+ role: h.direction === 'inbound' ? 'user' : 'assistant',
229
+ content: h.content,
230
+ })),
231
+ { role: 'user', content: turn.message.text },
232
+ ];
233
+ const model = config.agent.model.startsWith('openrouter/')
234
+ ? config.agent.model.slice('openrouter/'.length)
235
+ : config.agent.model;
236
+ // Agentic loop
237
+ let totalTokensIn = 0;
238
+ let totalTokensOut = 0;
239
+ let lastToolName;
240
+ let lastToolError;
241
+ let lastToolInput;
242
+ let identicalFailureStreak = 0;
243
+ let stoppedByHook = false;
244
+ let reviewAttempts = 0;
245
+ const rejectedReplies = new Set();
246
+ const toolCallResults = [];
247
+ for (let step = 0; step < config.agent.maxSteps; step++) {
248
+ const hookState = { step, toolCalls: toolCallResults.length, lastToolName, lastToolError, lastToolInput, identicalFailureStreak };
249
+ const prepared = hooks?.prepareStep?.(hookState, promptCtx);
250
+ const stepMessages = prepared?.appendSystem
251
+ ? [...llmMessages, { role: 'system', content: prepared.appendSystem }]
252
+ : llmMessages;
253
+ const body = {
254
+ model,
255
+ messages: stepMessages,
256
+ reasoning: { effort: 'low', exclude: true },
257
+ };
258
+ if (openaiTools.length > 0)
259
+ body.tools = openaiTools;
260
+ const res = await fetch(`${OPENROUTER_BASE_URL}/chat/completions`, {
261
+ method: 'POST',
262
+ headers: {
263
+ 'Authorization': `Bearer ${OPENROUTER_API_KEY}`,
264
+ 'Content-Type': 'application/json',
265
+ 'HTTP-Referer': 'https://onkeiki.com',
266
+ 'X-Title': 'Keiki SDK',
267
+ },
268
+ body: JSON.stringify(body),
269
+ });
270
+ if (!res.ok)
271
+ throw new Error(`OpenRouter ${res.status}: ${await res.text()}`);
272
+ const data = await res.json();
273
+ totalTokensIn += data.usage?.prompt_tokens ?? 0;
274
+ totalTokensOut += data.usage?.completion_tokens ?? 0;
275
+ const msg = data.choices?.[0]?.message;
276
+ if (!msg)
277
+ throw new Error('No response from LLM');
278
+ // No tool calls — final response. Review gates the delivered
279
+ // (post-transformReply) text and fails closed: a rejected candidate is
280
+ // never delivered, even when retries run out.
281
+ if (!msg.tool_calls || msg.tool_calls.length === 0) {
282
+ const candidate = finishReply(msg.content ?? '');
283
+ const review = hooks?.reviewReply?.(candidate, promptCtx, { toolResults: toolCallResults, attempt: reviewAttempts });
284
+ if (review?.retryWith) {
285
+ rejectedReplies.add(msg.content ?? '');
286
+ if (reviewAttempts < MAX_REPLY_REVIEW_RETRIES) {
287
+ reviewAttempts++;
288
+ llmMessages.push({ role: 'assistant', content: msg.content ?? '' });
289
+ llmMessages.push({ role: 'system', content: review.retryWith });
290
+ continue;
291
+ }
292
+ return {
293
+ reply: '',
294
+ toolCalls: toolCallResults.length > 0 ? toolCallResults : undefined,
295
+ shouldLearn: config.agent.memory?.enabled ?? false,
296
+ tokensIn: totalTokensIn,
297
+ tokensOut: totalTokensOut,
298
+ };
299
+ }
300
+ return {
301
+ reply: candidate,
302
+ toolCalls: toolCallResults.length > 0 ? toolCallResults : undefined,
303
+ shouldLearn: config.agent.memory?.enabled ?? false,
304
+ tokensIn: totalTokensIn,
305
+ tokensOut: totalTokensOut,
306
+ };
307
+ }
308
+ // Add assistant message with tool_calls
309
+ llmMessages.push({
310
+ role: 'assistant',
311
+ content: msg.content || null,
312
+ tool_calls: msg.tool_calls,
313
+ });
314
+ // Execute each tool call via Effect
315
+ for (const toolCall of msg.tool_calls) {
316
+ const toolDef = allTools.find((t) => t.name === toolCall.function.name);
317
+ if (!toolDef) {
318
+ llmMessages.push({ role: 'tool', tool_call_id: toolCall.id, content: `Error: Unknown tool ${toolCall.function.name}` });
319
+ continue;
320
+ }
321
+ // Run beforeToolCall hooks
322
+ let toolCallEvent = { phone: turn.message.phone, toolName: toolCall.function.name, input: null };
323
+ for (const hook of resolved.hooks.beforeToolCall) {
324
+ toolCallEvent = await Effect.runPromise(hook(toolCallEvent).pipe(Effect.orDie));
325
+ }
326
+ const toolStart = Date.now();
327
+ try {
328
+ const args = JSON.parse(toolCall.function.arguments);
329
+ toolCallEvent.input = args;
330
+ const decoded = Schema.decodeUnknownSync(toolDef.input)(args);
331
+ const result = await Effect.runPromise(toolDef.execute(decoded, {
332
+ phone: turn.message.phone,
333
+ user: promptCtx.user,
334
+ blackboard: {},
335
+ platform: {},
336
+ userState: makeNoopUserState(),
337
+ secrets: makeNoopSecrets(),
338
+ db: (config.storage && 'pluginDb' in config.storage ? config.storage.pluginDb : undefined) ?? makeNoopPluginDb(),
339
+ sandbox: makeNoopSandbox(),
340
+ }));
341
+ const resultStr = typeof result === 'string' ? result : JSON.stringify(result);
342
+ toolCallResults.push({ name: toolCall.function.name, input: args, output: result });
343
+ lastToolName = toolCall.function.name;
344
+ lastToolError = undefined;
345
+ lastToolInput = toolCall.function.arguments;
346
+ identicalFailureStreak = 0;
347
+ llmMessages.push({ role: 'tool', tool_call_id: toolCall.id, content: resultStr });
348
+ // Run afterToolCall hooks
349
+ for (const hook of resolved.hooks.afterToolCall) {
350
+ await Effect.runPromise(hook({
351
+ phone: turn.message.phone,
352
+ toolName: toolCall.function.name,
353
+ input: args,
354
+ output: result,
355
+ durationMs: Date.now() - toolStart,
356
+ }).pipe(Effect.orDie));
357
+ }
358
+ }
359
+ catch (err) {
360
+ const errStr = `Error: ${err instanceof Error ? err.message : String(err)}`;
361
+ llmMessages.push({ role: 'tool', tool_call_id: toolCall.id, content: errStr });
362
+ const sameFailure = lastToolName === toolCall.function.name &&
363
+ lastToolInput === toolCall.function.arguments &&
364
+ lastToolError === errStr;
365
+ identicalFailureStreak = sameFailure ? identicalFailureStreak + 1 : 1;
366
+ lastToolName = toolCall.function.name;
367
+ lastToolError = errStr;
368
+ lastToolInput = toolCall.function.arguments;
369
+ // Run afterToolCall hooks with error
370
+ for (const hook of resolved.hooks.afterToolCall) {
371
+ await Effect.runPromise(hook({
372
+ phone: turn.message.phone,
373
+ toolName: toolCall.function.name,
374
+ input: toolCallEvent.input,
375
+ output: null,
376
+ durationMs: Date.now() - toolStart,
377
+ error: errStr,
378
+ }).pipe(Effect.orDie));
379
+ }
380
+ }
381
+ }
382
+ // Developer stop condition: end the turn with the last assistant text.
383
+ if (hooks?.stopWhen?.({ step, toolCalls: toolCallResults.length, lastToolName, lastToolError, lastToolInput, identicalFailureStreak }, promptCtx)) {
384
+ stoppedByHook = true;
385
+ break;
386
+ }
387
+ }
388
+ // Loop ended without a tool-free reply: use the last assistant text the
389
+ // model produced. Only real step exhaustion gets the apology — a
390
+ // developer stop condition is intentional and must not read as a failure.
391
+ const lastAssistantText = llmMessages
392
+ .filter((m) => m.role === 'assistant' && typeof m.content === 'string' && m.content && !rejectedReplies.has(m.content))
393
+ .pop()?.content;
394
+ return {
395
+ reply: finishReply(lastAssistantText ?? (stoppedByHook ? '' : 'I apologize, I ran out of steps processing your request.')),
396
+ toolCalls: toolCallResults.length > 0 ? toolCallResults : undefined,
397
+ shouldLearn: config.agent.memory?.enabled ?? false,
398
+ tokensIn: totalTokensIn,
399
+ tokensOut: totalTokensOut,
400
+ };
401
+ },
402
+ catch: (e) => e,
403
+ }).pipe(Effect.orDie);
404
+ }
405
+ /** Whether the durable alert-state table has been ensured this process. */
406
+ let alertStateTableEnsured = false;
407
+ /**
408
+ * Durable per-(alert, subscriber) KV state, persisted through the configured
409
+ * PluginDb. Falls back to per-run in-memory state when no PluginDb is
410
+ * configured, so alerts still run (just without cross-run durability).
411
+ */
412
+ function makeAlertState(pluginDb, alertName, phone) {
413
+ if (!pluginDb) {
414
+ const mem = new Map();
415
+ return {
416
+ get: (key) => Effect.succeed(mem.get(key) ?? null),
417
+ set: (key, value) => Effect.sync(() => { mem.set(key, value); }),
418
+ };
419
+ }
420
+ const ensureTable = Effect.suspend(() => {
421
+ if (alertStateTableEnsured)
422
+ return Effect.void;
423
+ return pluginDb.execute(`CREATE TABLE IF NOT EXISTS smskit_alert_state (
424
+ alert_name TEXT NOT NULL,
425
+ phone TEXT NOT NULL,
426
+ key TEXT NOT NULL,
427
+ value JSONB,
428
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT now(),
429
+ PRIMARY KEY (alert_name, phone, key)
430
+ )`).pipe(Effect.tap(() => Effect.sync(() => { alertStateTableEnsured = true; })),
431
+ // Concurrent CREATE TABLE IF NOT EXISTS can race itself in Postgres
432
+ // (duplicate-relation error); the table exists either way, so swallow
433
+ // the DDL failure and let the actual read/write surface real errors.
434
+ Effect.catchAll(() => Effect.void));
435
+ });
436
+ return {
437
+ get: (key) => ensureTable.pipe(Effect.andThen(pluginDb.queryOne(`SELECT value FROM smskit_alert_state WHERE alert_name = $1 AND phone = $2 AND key = $3`, [alertName, phone, key])), Effect.map((row) => row?.value ?? null), Effect.orDie),
438
+ set: (key, value) => ensureTable.pipe(Effect.andThen(pluginDb.execute(`INSERT INTO smskit_alert_state (alert_name, phone, key, value, updated_at)
439
+ VALUES ($1, $2, $3, $4, now())
440
+ ON CONFLICT (alert_name, phone, key) DO UPDATE SET value = EXCLUDED.value, updated_at = now()`, [alertName, phone, key, JSON.stringify(value ?? null)])), Effect.orDie),
441
+ };
442
+ }
443
+ function makeNoopUserState() {
444
+ const store = new Map();
445
+ return {
446
+ get: (key) => Effect.succeed(store.get(key) ?? null),
447
+ set: (key, value) => Effect.sync(() => { store.set(key, value); }),
448
+ delete: (key) => Effect.succeed(store.delete(key)),
449
+ getAll: () => Effect.succeed(Object.fromEntries(store)),
450
+ setMany: (entries) => Effect.sync(() => { for (const [k, v] of Object.entries(entries))
451
+ store.set(k, v); }),
452
+ };
453
+ }
454
+ function makeNoopSecrets() {
455
+ return {
456
+ get: () => Effect.succeed(null),
457
+ getAll: () => Effect.succeed({}),
458
+ };
459
+ }
460
+ function makeNoopPluginDb() {
461
+ const err = new StorageError('PluginDb not configured. Use PostgresStorage() instead of PostgresStorageLive().');
462
+ return {
463
+ query: () => Effect.fail(err),
464
+ queryOne: () => Effect.fail(err),
465
+ execute: () => Effect.fail(err),
466
+ };
467
+ }
468
+ function makeNoopSandbox() {
469
+ const err = () => { throw new Error('SandboxProvider not configured. Enable the Sandbox capability via the sandbox() plugin.'); };
470
+ return {
471
+ exec: err,
472
+ getPublicUrl: err,
473
+ getHomeDir: err,
474
+ };
475
+ }
476
+ //# sourceMappingURL=Server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Server.js","sourceRoot":"","sources":["../src/Server.ts"],"names":[],"mappings":"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"}