@codeworksh/aikit 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { Filesystem, NamedError, lazy } from "@codeworksh/utils";
2
2
  import { Type } from "@sinclair/typebox";
3
+ import { uuidv7 } from "uuidv7";
3
4
  import { keys, mapValues, pick, pipe } from "remeda";
4
5
  import Anthropic from "@anthropic-ai/sdk";
5
6
  import { parse } from "partial-json";
@@ -347,6 +348,7 @@ let Message;
347
348
  Type.Literal("aborted")
348
349
  ]);
349
350
  const UserMessageSchema = _Message.UserMessageSchema = Type.Object({
351
+ messageId: Type.String(),
350
352
  role: Type.Literal("user"),
351
353
  time: Type.Object({ created: Type.Number() }),
352
354
  parts: Type.Array(Type.Union([TextContentSchema, ImageContentSchema]))
@@ -369,9 +371,30 @@ let Message;
369
371
  ThinkingContentSchema,
370
372
  ToolCallSchema
371
373
  ])),
372
- responseID: Type.Optional(Type.String())
374
+ responseId: Type.Optional(Type.String()),
375
+ messageId: Type.String()
373
376
  });
374
377
  const MessageSchema = _Message.MessageSchema = Type.Union([UserMessageSchema, AssistantMessageSchema]);
378
+ function createMessageId() {
379
+ return uuidv7();
380
+ }
381
+ _Message.createMessageId = createMessageId;
382
+ function createUserMessage(message) {
383
+ const { messageId = createMessageId(), ...rest } = message;
384
+ return {
385
+ messageId,
386
+ ...rest
387
+ };
388
+ }
389
+ _Message.createUserMessage = createUserMessage;
390
+ function createAssistantMessage(message) {
391
+ const { messageId = createMessageId(), ...rest } = message;
392
+ return {
393
+ messageId,
394
+ ...rest
395
+ };
396
+ }
397
+ _Message.createAssistantMessage = createAssistantMessage;
375
398
  const ToolSchema = _Message.ToolSchema = Type.Object({
376
399
  name: Type.String(),
377
400
  description: Type.String(),
@@ -1028,7 +1051,7 @@ function buildParams(model, context, isOAuthToken, options) {
1028
1051
  const streamAnthropic = (model, context, options) => {
1029
1052
  const stream = new AssistantMessageEventStream();
1030
1053
  (async () => {
1031
- const output = {
1054
+ const output = Message.createAssistantMessage({
1032
1055
  role: "assistant",
1033
1056
  parts: [],
1034
1057
  protocol: model.protocol,
@@ -1053,7 +1076,7 @@ const streamAnthropic = (model, context, options) => {
1053
1076
  created: Date.now(),
1054
1077
  completed: Date.now()
1055
1078
  }
1056
- };
1079
+ });
1057
1080
  try {
1058
1081
  let client;
1059
1082
  let isOAuthToken;
@@ -1080,7 +1103,7 @@ const streamAnthropic = (model, context, options) => {
1080
1103
  });
1081
1104
  const blocks = output.parts;
1082
1105
  for await (const event of anthropicStream) if (event.type === "message_start") {
1083
- output.responseID = event.message.id;
1106
+ output.responseId = event.message.id;
1084
1107
  output.usage.input = event.message.usage.input_tokens || 0;
1085
1108
  output.usage.output = event.message.usage.output_tokens || 0;
1086
1109
  output.usage.cacheRead = event.message.usage.cache_read_input_tokens || 0;
@@ -1278,14 +1301,6 @@ const ajv = new Ajv({
1278
1301
  });
1279
1302
  addFormats(ajv);
1280
1303
  /**
1281
- * Finds a tool by name and validates the tool call arguments against its TypeBox schema
1282
- */
1283
- function validateToolCall(tools, toolExecution) {
1284
- const tool = tools.find((t) => t.name === toolExecution.name);
1285
- if (!tool) throw new Error(`Tool "${toolExecution.name}" not found`);
1286
- return validateToolArguments(tool, toolExecution);
1287
- }
1288
- /**
1289
1304
  * Validates tool call arguments against the tool's TypeBox schema
1290
1305
  */
1291
1306
  function validateToolArguments(tool, toolExecution) {
@@ -1849,7 +1864,6 @@ let Agent;
1849
1864
  _state;
1850
1865
  listeners = /* @__PURE__ */ new Set();
1851
1866
  abortController;
1852
- activeAssistantIndex;
1853
1867
  convertToLlm;
1854
1868
  transformContext;
1855
1869
  steeringQueue = [];
@@ -2001,19 +2015,34 @@ let Agent;
2001
2015
  }
2002
2016
  replaceMessages(ms) {
2003
2017
  this._state.messages = ms.slice();
2004
- this.activeAssistantIndex = void 0;
2005
2018
  }
2006
2019
  appendMessage(m) {
2007
2020
  this._state.messages = [...this._state.messages, m];
2008
2021
  }
2009
- patchStoredAssistantPart(partIndex, part) {
2010
- if (this.activeAssistantIndex === void 0) return false;
2022
+ findMessageIndexById(messageId) {
2023
+ return this._state.messages.findIndex((message) => message.messageId === messageId);
2024
+ }
2025
+ replaceMessageById(message) {
2026
+ const messageIndex = this.findMessageIndexById(message.messageId);
2027
+ if (messageIndex === -1) return false;
2011
2028
  const messages = this._state.messages.slice();
2012
- const existing = messages[this.activeAssistantIndex];
2029
+ messages[messageIndex] = message;
2030
+ this._state.messages = messages;
2031
+ return true;
2032
+ }
2033
+ upsertMessage(message) {
2034
+ if (this.replaceMessageById(message)) return;
2035
+ this.appendMessage(message);
2036
+ }
2037
+ patchStoredAssistantPart(messageId, partIndex, part) {
2038
+ const messageIndex = this.findMessageIndexById(messageId);
2039
+ if (messageIndex === -1) return false;
2040
+ const messages = this._state.messages.slice();
2041
+ const existing = messages[messageIndex];
2013
2042
  if (!existing || existing.role !== "assistant") return false;
2014
2043
  const nextParts = existing.parts.slice();
2015
2044
  nextParts[partIndex] = part;
2016
- messages[this.activeAssistantIndex] = {
2045
+ messages[messageIndex] = {
2017
2046
  ...existing,
2018
2047
  parts: nextParts
2019
2048
  };
@@ -2076,7 +2105,6 @@ let Agent;
2076
2105
  }
2077
2106
  clearMessages() {
2078
2107
  this._state.messages = [];
2079
- this.activeAssistantIndex = void 0;
2080
2108
  }
2081
2109
  abort() {
2082
2110
  this.abortController?.abort();
@@ -2090,7 +2118,6 @@ let Agent;
2090
2118
  this._state.streamMessage = null;
2091
2119
  this._state.pendingToolCalls = /* @__PURE__ */ new Set();
2092
2120
  this._state.error = void 0;
2093
- this.activeAssistantIndex = void 0;
2094
2121
  this.steeringQueue = [];
2095
2122
  this.followUpQueue = [];
2096
2123
  }
@@ -2147,7 +2174,7 @@ let Agent;
2147
2174
  if (messages) await Loop.runAgentLoop(config, context, messages, async (e) => this._processLoopEvent(e), this.streamFn, this.abortController.signal);
2148
2175
  else await Loop.runAgentLoopContinue(config, context, async (e) => this._processLoopEvent(e), this.streamFn, this.abortController.signal);
2149
2176
  } catch (err) {
2150
- const message = {
2177
+ const message = Message.createAssistantMessage({
2151
2178
  role: "assistant",
2152
2179
  protocol: model.protocol,
2153
2180
  provider: model.provider,
@@ -2173,7 +2200,7 @@ let Agent;
2173
2200
  completed: Date.now()
2174
2201
  },
2175
2202
  parts: []
2176
- };
2203
+ });
2177
2204
  this.appendMessage(message);
2178
2205
  this._state.error = err?.message || String(err);
2179
2206
  this.emit({
@@ -2201,32 +2228,31 @@ let Agent;
2201
2228
  async prompt(messages, images) {
2202
2229
  this.ensureIdle();
2203
2230
  if (!this._state.model) throw new ModelNotConfiguredErr({ message: "no model configured yet." });
2204
- const message = {
2231
+ const message = Message.createUserMessage({
2205
2232
  role: "user",
2206
2233
  time: { created: Date.now() },
2207
2234
  parts: [...messages, ...images ?? []]
2208
- };
2235
+ });
2209
2236
  await this.loop([message]);
2210
2237
  }
2211
2238
  _processLoopEvent(event) {
2212
2239
  switch (event.type) {
2213
2240
  case "message.start":
2214
2241
  this._state.streamMessage = event.message;
2215
- if (event.message.role === "assistant") this.activeAssistantIndex = void 0;
2216
2242
  break;
2217
2243
  case "message.part.start":
2218
2244
  case "message.part.update":
2219
2245
  case "message.part.end":
2220
2246
  this._state.streamMessage = event.message;
2221
- if (event.message.role === "assistant") this.patchStoredAssistantPart(event.partIndex, event.part);
2247
+ if (event.message.role === "assistant") this.patchStoredAssistantPart(event.message.messageId, event.partIndex, event.part);
2222
2248
  break;
2223
2249
  case "message.update":
2224
2250
  this._state.streamMessage = event.message;
2251
+ this.replaceMessageById(event.message);
2225
2252
  break;
2226
2253
  case "message.end":
2227
2254
  this._state.streamMessage = null;
2228
- this.appendMessage(event.message);
2229
- if (event.message.role === "assistant") this.activeAssistantIndex = this._state.messages.length - 1;
2255
+ this.upsertMessage(event.message);
2230
2256
  break;
2231
2257
  case "tool.execution.start": {
2232
2258
  const pendingToolCalls = new Set(this._state.pendingToolCalls);
@@ -2273,206 +2299,10 @@ let Agent;
2273
2299
  //#endregion
2274
2300
  //#region src/agent.ts
2275
2301
  const agent = {
2276
- create: Agent.create,
2277
2302
  loop: Loop.run,
2278
2303
  loopContinue: Loop.runContinue
2279
2304
  };
2280
2305
  //#endregion
2281
- //#region src/event/event.ts
2282
- let Event;
2283
- (function(_Event) {
2284
- const LLMMessageEventType = _Event.LLMMessageEventType = {
2285
- start: "start",
2286
- textStart: "text.start",
2287
- textDelta: "text.delta",
2288
- textEnd: "text.end",
2289
- thinkingStart: "thinking.start",
2290
- thinkingDelta: "thinking.delta",
2291
- thinkingEnd: "thinking.end",
2292
- toolcallStart: "toolcall.start",
2293
- toolcallDelta: "toolcall.delta",
2294
- toolcallEnd: "toolcall.end",
2295
- done: "done",
2296
- error: "error"
2297
- };
2298
- _Event.LLMMessageEventSchema = Type.Union([
2299
- Type.Object({
2300
- type: Type.Literal(LLMMessageEventType.start),
2301
- partial: Message.AssistantMessageSchema
2302
- }),
2303
- Type.Object({
2304
- type: Type.Literal(LLMMessageEventType.textStart),
2305
- partIndex: Type.Number(),
2306
- partial: Message.AssistantMessageSchema
2307
- }),
2308
- Type.Object({
2309
- type: Type.Literal(LLMMessageEventType.textDelta),
2310
- partIndex: Type.Number(),
2311
- delta: Type.String(),
2312
- partial: Message.AssistantMessageSchema
2313
- }),
2314
- Type.Object({
2315
- type: Type.Literal(LLMMessageEventType.textEnd),
2316
- partIndex: Type.Number(),
2317
- content: Type.String(),
2318
- partial: Message.AssistantMessageSchema
2319
- }),
2320
- Type.Object({
2321
- type: Type.Literal(LLMMessageEventType.thinkingStart),
2322
- partIndex: Type.Number(),
2323
- partial: Message.AssistantMessageSchema
2324
- }),
2325
- Type.Object({
2326
- type: Type.Literal(LLMMessageEventType.thinkingDelta),
2327
- partIndex: Type.Number(),
2328
- delta: Type.String(),
2329
- partial: Message.AssistantMessageSchema
2330
- }),
2331
- Type.Object({
2332
- type: Type.Literal(LLMMessageEventType.thinkingEnd),
2333
- partIndex: Type.Number(),
2334
- content: Type.String(),
2335
- partial: Message.AssistantMessageSchema
2336
- }),
2337
- Type.Object({
2338
- type: Type.Literal(LLMMessageEventType.toolcallStart),
2339
- partIndex: Type.Number(),
2340
- partial: Message.AssistantMessageSchema
2341
- }),
2342
- Type.Object({
2343
- type: Type.Literal(LLMMessageEventType.toolcallDelta),
2344
- partIndex: Type.Number(),
2345
- delta: Type.String(),
2346
- partial: Message.AssistantMessageSchema
2347
- }),
2348
- Type.Object({
2349
- type: Type.Literal(LLMMessageEventType.toolcallEnd),
2350
- partIndex: Type.Number(),
2351
- toolCall: Message.ToolCallSchema,
2352
- partial: Message.AssistantMessageSchema
2353
- }),
2354
- Type.Object({
2355
- type: Type.Literal(LLMMessageEventType.done),
2356
- reason: Type.Union([
2357
- Type.Literal("stop"),
2358
- Type.Literal("length"),
2359
- Type.Literal("toolUse")
2360
- ]),
2361
- message: Message.AssistantMessageSchema
2362
- }),
2363
- Type.Object({
2364
- type: Type.Literal(LLMMessageEventType.error),
2365
- reason: Type.Union([Type.Literal("aborted"), Type.Literal("error")]),
2366
- error: Message.AssistantMessageSchema
2367
- })
2368
- ]);
2369
- const AgentEventType = _Event.AgentEventType = {
2370
- agentStart: "agent.start",
2371
- agentEnd: "agent.end",
2372
- turnStart: "turn.start",
2373
- turnEnd: "turn.end",
2374
- messageStart: "message.start",
2375
- messagePartStart: "message.part.start",
2376
- messagePartUpdate: "message.part.update",
2377
- messagePartEnd: "message.part.end",
2378
- messageUpdate: "message.update",
2379
- messageEnd: "message.end",
2380
- toolExecutionStart: "tool.execution.start",
2381
- toolExecutionUpdate: "tool.execution.update",
2382
- toolExecutionEnd: "tool.execution.end"
2383
- };
2384
- const UserMessagePart = Type.Union([Message.TextContentSchema, Message.ImageContentSchema]);
2385
- const AssistantMessagePart = Type.Union([
2386
- Message.TextContentSchema,
2387
- Message.ImageContentSchema,
2388
- Message.ThinkingContentSchema,
2389
- Message.ToolCallSchema
2390
- ]);
2391
- const UserMessagePartStart = Type.Object({
2392
- type: Type.Literal(AgentEventType.messagePartStart),
2393
- message: Message.UserMessageSchema,
2394
- partIndex: Type.Number(),
2395
- part: UserMessagePart
2396
- });
2397
- const UserMessagePartEnd = Type.Object({
2398
- type: Type.Literal(AgentEventType.messagePartEnd),
2399
- message: Message.UserMessageSchema,
2400
- partIndex: Type.Number(),
2401
- part: UserMessagePart
2402
- });
2403
- const AssistantMessagePartStart = Type.Object({
2404
- type: Type.Literal(AgentEventType.messagePartStart),
2405
- message: Message.AssistantMessageSchema,
2406
- partIndex: Type.Number(),
2407
- part: AssistantMessagePart
2408
- });
2409
- const AssistantMessagePartLLMUpdate = Type.Object({
2410
- type: Type.Literal(AgentEventType.messagePartUpdate),
2411
- message: Message.AssistantMessageSchema,
2412
- partIndex: Type.Number(),
2413
- part: AssistantMessagePart,
2414
- source: Type.Literal("llm")
2415
- });
2416
- const AssistantMessagePartToolUpdate = Type.Object({
2417
- type: Type.Literal(AgentEventType.messagePartUpdate),
2418
- message: Message.AssistantMessageSchema,
2419
- partIndex: Type.Number(),
2420
- part: AssistantMessagePart,
2421
- source: Type.Literal("tool")
2422
- });
2423
- const AssistantMessagePartEnd = Type.Object({
2424
- type: Type.Literal(AgentEventType.messagePartEnd),
2425
- message: Message.AssistantMessageSchema,
2426
- partIndex: Type.Number(),
2427
- part: AssistantMessagePart
2428
- });
2429
- const ToolExecutionStartSchema = Type.Composite([Agent.ToolCallInFlightSchema, Type.Object({ type: Type.Literal(AgentEventType.toolExecutionStart) })]);
2430
- const ToolExecutionUpdateSchema = Type.Composite([
2431
- Agent.ToolCallInFlightSchema,
2432
- Type.Object({ type: Type.Literal(AgentEventType.toolExecutionUpdate) }),
2433
- Message.ToolRunningSchema
2434
- ]);
2435
- const ToolExecutionEndSchema = Type.Composite([
2436
- Agent.ToolCallInFlightSchema,
2437
- Type.Object({ type: Type.Literal(AgentEventType.toolExecutionEnd) }),
2438
- Type.Union([Message.ToolCompletedSchema, Message.ToolErrorSchema])
2439
- ]);
2440
- _Event.AgentEventSchema = Type.Union([
2441
- Type.Object({ type: Type.Literal(AgentEventType.agentStart) }),
2442
- Type.Object({
2443
- type: Type.Literal(AgentEventType.agentEnd),
2444
- messages: Type.Array(Message.MessageSchema)
2445
- }),
2446
- Type.Object({ type: Type.Literal(AgentEventType.turnStart) }),
2447
- Type.Object({
2448
- type: Type.Literal(AgentEventType.turnEnd),
2449
- message: Message.AssistantMessageSchema
2450
- }),
2451
- Type.Object({
2452
- type: Type.Literal(AgentEventType.messageStart),
2453
- message: Message.MessageSchema
2454
- }),
2455
- Type.Union([UserMessagePartStart, UserMessagePartEnd]),
2456
- Type.Union([
2457
- AssistantMessagePartStart,
2458
- AssistantMessagePartLLMUpdate,
2459
- AssistantMessagePartToolUpdate,
2460
- AssistantMessagePartEnd
2461
- ]),
2462
- Type.Object({
2463
- type: Type.Literal(AgentEventType.messageUpdate),
2464
- message: Message.MessageSchema
2465
- }),
2466
- Type.Object({
2467
- type: Type.Literal(AgentEventType.messageEnd),
2468
- message: Message.MessageSchema
2469
- }),
2470
- ToolExecutionStartSchema,
2471
- ToolExecutionUpdateSchema,
2472
- ToolExecutionEndSchema
2473
- ]);
2474
- })(Event || (Event = {}));
2475
- //#endregion
2476
2306
  //#region src/llm.ts
2477
2307
  const llmImpl = async (provider, model) => Model.getModel(provider, model);
2478
2308
  const llm = Object.assign(llmImpl, {
@@ -2503,13 +2333,10 @@ const stream = Object.assign(streamImpl, {
2503
2333
  completeSimple: Stream.completeSimple,
2504
2334
  resolveProtocolProvider: Stream.resolveProtocolProvider
2505
2335
  });
2506
- /** Resolve a streamed response directly to the final assistant message. */
2507
- const complete = Stream.complete;
2508
- /** Start a stream using the simplified options surface. */
2509
- const streamSimple = Stream.streamSimple;
2510
- /** Resolve a simplified stream request directly to the final assistant message. */
2511
- const completeSimple = Stream.completeSimple;
2336
+ Stream.complete;
2337
+ Stream.streamSimple;
2338
+ Stream.completeSimple;
2512
2339
  //#endregion
2513
- export { Agent, Event, Message, Model, ModelCatalog, Stream, agent, complete, completeSimple, llm, stream, streamSimple, validateToolArguments, validateToolCall };
2340
+ export { Agent, Message, agent, llm, stream };
2514
2341
 
2515
2342
  //# sourceMappingURL=index.mjs.map