@swirls/looms 0.0.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.
Files changed (270) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +9 -0
  3. package/dist/actor/cell.d.ts +27 -0
  4. package/dist/actor/cell.js +41 -0
  5. package/dist/actor/host.d.ts +27 -0
  6. package/dist/actor/host.js +82 -0
  7. package/dist/actor/index.d.ts +3 -0
  8. package/dist/actor/index.js +3 -0
  9. package/dist/actor/routing.d.ts +15 -0
  10. package/dist/actor/routing.js +80 -0
  11. package/dist/agent/definitions-store.d.ts +11 -0
  12. package/dist/agent/definitions-store.js +10 -0
  13. package/dist/agent/definitions.d.ts +152 -0
  14. package/dist/agent/definitions.js +74 -0
  15. package/dist/agent/effects.d.ts +425 -0
  16. package/dist/agent/effects.js +318 -0
  17. package/dist/agent/events.d.ts +170 -0
  18. package/dist/agent/events.js +61 -0
  19. package/dist/agent/index.d.ts +13 -0
  20. package/dist/agent/index.js +13 -0
  21. package/dist/agent/llm.d.ts +35 -0
  22. package/dist/agent/llm.js +48 -0
  23. package/dist/agent/module.d.ts +1037 -0
  24. package/dist/agent/module.js +27 -0
  25. package/dist/agent/projections.d.ts +17 -0
  26. package/dist/agent/projections.js +81 -0
  27. package/dist/agent/scope.d.ts +171 -0
  28. package/dist/agent/scope.js +7 -0
  29. package/dist/agent/signals.d.ts +17 -0
  30. package/dist/agent/signals.js +19 -0
  31. package/dist/agent/stop-when.d.ts +12 -0
  32. package/dist/agent/stop-when.js +6 -0
  33. package/dist/agent/threads.d.ts +34 -0
  34. package/dist/agent/threads.js +407 -0
  35. package/dist/agent/tool-schema.d.ts +21 -0
  36. package/dist/agent/tool-schema.js +67 -0
  37. package/dist/agent/types.d.ts +87 -0
  38. package/dist/agent/types.js +32 -0
  39. package/dist/ai-vercel/index.d.ts +2 -0
  40. package/dist/ai-vercel/index.js +2 -0
  41. package/dist/ai-vercel/messages.d.ts +9 -0
  42. package/dist/ai-vercel/messages.js +68 -0
  43. package/dist/ai-vercel/vercel-llm.d.ts +8 -0
  44. package/dist/ai-vercel/vercel-llm.js +98 -0
  45. package/dist/approval/effects.d.ts +133 -0
  46. package/dist/approval/effects.js +13 -0
  47. package/dist/approval/events.d.ts +52 -0
  48. package/dist/approval/events.js +28 -0
  49. package/dist/approval/index.d.ts +6 -0
  50. package/dist/approval/index.js +6 -0
  51. package/dist/approval/module.d.ts +342 -0
  52. package/dist/approval/module.js +10 -0
  53. package/dist/approval/projections.d.ts +42 -0
  54. package/dist/approval/projections.js +57 -0
  55. package/dist/approval/scope.d.ts +45 -0
  56. package/dist/approval/scope.js +7 -0
  57. package/dist/approval/signals.d.ts +19 -0
  58. package/dist/approval/signals.js +34 -0
  59. package/dist/cli/cli.d.ts +2 -0
  60. package/dist/cli/cli.js +6 -0
  61. package/dist/cli/commands.d.ts +13 -0
  62. package/dist/cli/commands.js +133 -0
  63. package/dist/cli/index.d.ts +1 -0
  64. package/dist/cli/index.js +1 -0
  65. package/dist/client/client.d.ts +69 -0
  66. package/dist/client/client.js +179 -0
  67. package/dist/client/index.d.ts +2 -0
  68. package/dist/client/index.js +2 -0
  69. package/dist/client/sse.d.ts +10 -0
  70. package/dist/client/sse.js +103 -0
  71. package/dist/cloudflare/alarm-scheduler.d.ts +9 -0
  72. package/dist/cloudflare/alarm-scheduler.js +13 -0
  73. package/dist/cloudflare/durable-object.d.ts +24 -0
  74. package/dist/cloudflare/durable-object.js +43 -0
  75. package/dist/cloudflare/event-store.d.ts +10 -0
  76. package/dist/cloudflare/event-store.js +18 -0
  77. package/dist/cloudflare/index.d.ts +4 -0
  78. package/dist/cloudflare/index.js +4 -0
  79. package/dist/cloudflare/router.d.ts +12 -0
  80. package/dist/cloudflare/router.js +26 -0
  81. package/dist/core/bun-sqlite.d.ts +13 -0
  82. package/dist/core/bun-sqlite.js +19 -0
  83. package/dist/core/catalog.d.ts +49 -0
  84. package/dist/core/catalog.js +39 -0
  85. package/dist/core/coalesce.d.ts +21 -0
  86. package/dist/core/coalesce.js +178 -0
  87. package/dist/core/compose.d.ts +59 -0
  88. package/dist/core/compose.js +97 -0
  89. package/dist/core/cursor.d.ts +16 -0
  90. package/dist/core/cursor.js +46 -0
  91. package/dist/core/effects.d.ts +110 -0
  92. package/dist/core/effects.js +99 -0
  93. package/dist/core/envelope.d.ts +79 -0
  94. package/dist/core/envelope.js +68 -0
  95. package/dist/core/event-codec.d.ts +8 -0
  96. package/dist/core/event-codec.js +82 -0
  97. package/dist/core/event-index.d.ts +28 -0
  98. package/dist/core/event-index.js +86 -0
  99. package/dist/core/fold.d.ts +19 -0
  100. package/dist/core/fold.js +362 -0
  101. package/dist/core/ids.d.ts +11 -0
  102. package/dist/core/ids.js +47 -0
  103. package/dist/core/index.d.ts +26 -0
  104. package/dist/core/index.js +25 -0
  105. package/dist/core/match.d.ts +8 -0
  106. package/dist/core/match.js +58 -0
  107. package/dist/core/module-scope.d.ts +99 -0
  108. package/dist/core/module-scope.js +72 -0
  109. package/dist/core/module.d.ts +74 -0
  110. package/dist/core/module.js +3 -0
  111. package/dist/core/projection.d.ts +83 -0
  112. package/dist/core/projection.js +241 -0
  113. package/dist/core/protocol.d.ts +99 -0
  114. package/dist/core/protocol.js +101 -0
  115. package/dist/core/replay.d.ts +13 -0
  116. package/dist/core/replay.js +34 -0
  117. package/dist/core/schema.d.ts +35 -0
  118. package/dist/core/schema.js +130 -0
  119. package/dist/core/serialize.d.ts +14 -0
  120. package/dist/core/serialize.js +42 -0
  121. package/dist/core/snapshot-store.d.ts +39 -0
  122. package/dist/core/snapshot-store.js +53 -0
  123. package/dist/core/snapshots.d.ts +26 -0
  124. package/dist/core/snapshots.js +100 -0
  125. package/dist/core/sqlite-store.d.ts +31 -0
  126. package/dist/core/sqlite-store.js +328 -0
  127. package/dist/core/state.d.ts +43 -0
  128. package/dist/core/state.js +31 -0
  129. package/dist/core/store.d.ts +146 -0
  130. package/dist/core/store.js +229 -0
  131. package/dist/core/thread.d.ts +41 -0
  132. package/dist/core/thread.js +13 -0
  133. package/dist/core/types.d.ts +27 -0
  134. package/dist/core/types.js +42 -0
  135. package/dist/core/validate-event.d.ts +19 -0
  136. package/dist/core/validate-event.js +42 -0
  137. package/dist/debugger/components/debugger-split.d.ts +23 -0
  138. package/dist/debugger/components/debugger-split.js +25 -0
  139. package/dist/debugger/components/event-inspector.d.ts +5 -0
  140. package/dist/debugger/components/event-inspector.js +38 -0
  141. package/dist/debugger/components/event-stream.d.ts +13 -0
  142. package/dist/debugger/components/event-stream.js +119 -0
  143. package/dist/debugger/components/json-view.d.ts +5 -0
  144. package/dist/debugger/components/json-view.js +5 -0
  145. package/dist/debugger/components/run-tree.d.ts +14 -0
  146. package/dist/debugger/components/run-tree.js +38 -0
  147. package/dist/debugger/components/status-dot.d.ts +3 -0
  148. package/dist/debugger/components/status-dot.js +5 -0
  149. package/dist/debugger/contracts.d.ts +22 -0
  150. package/dist/debugger/contracts.js +1 -0
  151. package/dist/debugger/events/catalog.d.ts +6 -0
  152. package/dist/debugger/events/catalog.js +27 -0
  153. package/dist/debugger/events/domain-summarize.d.ts +3 -0
  154. package/dist/debugger/events/domain-summarize.js +107 -0
  155. package/dist/debugger/events/family.d.ts +8 -0
  156. package/dist/debugger/events/family.js +44 -0
  157. package/dist/debugger/events/protocol-summarize.d.ts +3 -0
  158. package/dist/debugger/events/protocol-summarize.js +70 -0
  159. package/dist/debugger/index.d.ts +17 -0
  160. package/dist/debugger/index.js +16 -0
  161. package/dist/debugger/lib/cn.d.ts +5 -0
  162. package/dist/debugger/lib/cn.js +17 -0
  163. package/dist/debugger/lib/event-counts.d.ts +5 -0
  164. package/dist/debugger/lib/event-counts.js +23 -0
  165. package/dist/debugger/lib/event-meta.d.ts +8 -0
  166. package/dist/debugger/lib/event-meta.js +20 -0
  167. package/dist/debugger/lib/project-run.d.ts +9 -0
  168. package/dist/debugger/lib/project-run.js +14 -0
  169. package/dist/debugger/lib/status.d.ts +3 -0
  170. package/dist/debugger/lib/status.js +31 -0
  171. package/dist/debugger/lib/visible-events.d.ts +8 -0
  172. package/dist/debugger/lib/visible-events.js +21 -0
  173. package/dist/debugger/styles.css +71 -0
  174. package/dist/debugger/ui/checkbox.d.ts +4 -0
  175. package/dist/debugger/ui/checkbox.js +9 -0
  176. package/dist/debugger/ui/input.d.ts +3 -0
  177. package/dist/debugger/ui/input.js +7 -0
  178. package/dist/debugger/ui/scroll-area.d.ts +9 -0
  179. package/dist/debugger/ui/scroll-area.js +10 -0
  180. package/dist/debugger/ui/tabs.d.ts +7 -0
  181. package/dist/debugger/ui/tabs.js +17 -0
  182. package/dist/index.d.ts +2 -0
  183. package/dist/index.js +2 -0
  184. package/dist/projectors/index-model.d.ts +56 -0
  185. package/dist/projectors/index-model.js +117 -0
  186. package/dist/projectors/index.d.ts +4 -0
  187. package/dist/projectors/index.js +3 -0
  188. package/dist/projectors/memory.d.ts +5 -0
  189. package/dist/projectors/memory.js +77 -0
  190. package/dist/projectors/postgres.d.ts +9 -0
  191. package/dist/projectors/postgres.js +108 -0
  192. package/dist/projectors/projector.d.ts +11 -0
  193. package/dist/projectors/projector.js +1 -0
  194. package/dist/projectors/schema.d.ts +5 -0
  195. package/dist/projectors/schema.js +43 -0
  196. package/dist/projectors/sqlite.d.ts +9 -0
  197. package/dist/projectors/sqlite.js +103 -0
  198. package/dist/projectors/with-projectors.d.ts +17 -0
  199. package/dist/projectors/with-projectors.js +55 -0
  200. package/dist/react/derived.d.ts +19 -0
  201. package/dist/react/derived.js +50 -0
  202. package/dist/react/index.d.ts +6 -0
  203. package/dist/react/index.js +5 -0
  204. package/dist/react/materialize.d.ts +3 -0
  205. package/dist/react/materialize.js +86 -0
  206. package/dist/react/notify.d.ts +18 -0
  207. package/dist/react/notify.js +80 -0
  208. package/dist/react/react.d.ts +61 -0
  209. package/dist/react/react.js +187 -0
  210. package/dist/react/register.d.ts +31 -0
  211. package/dist/react/register.js +1 -0
  212. package/dist/react/sse.d.ts +1 -0
  213. package/dist/react/sse.js +1 -0
  214. package/dist/react/store.d.ts +56 -0
  215. package/dist/react/store.js +340 -0
  216. package/dist/react/tables.d.ts +21 -0
  217. package/dist/react/tables.js +6 -0
  218. package/dist/runtime/dispatch-effect.d.ts +3 -0
  219. package/dist/runtime/dispatch-effect.js +113 -0
  220. package/dist/runtime/events-api.d.ts +4 -0
  221. package/dist/runtime/events-api.js +84 -0
  222. package/dist/runtime/index.d.ts +5 -0
  223. package/dist/runtime/index.js +5 -0
  224. package/dist/runtime/looms.d.ts +74 -0
  225. package/dist/runtime/looms.js +109 -0
  226. package/dist/runtime/runtime-helpers.d.ts +51 -0
  227. package/dist/runtime/runtime-helpers.js +230 -0
  228. package/dist/runtime/runtime.d.ts +91 -0
  229. package/dist/runtime/runtime.js +531 -0
  230. package/dist/runtime/server.d.ts +17 -0
  231. package/dist/runtime/server.js +226 -0
  232. package/dist/runtime/sse.d.ts +15 -0
  233. package/dist/runtime/sse.js +96 -0
  234. package/dist/runtime/wake-scheduler.d.ts +8 -0
  235. package/dist/runtime/wake-scheduler.js +38 -0
  236. package/dist/s2/config.d.ts +27 -0
  237. package/dist/s2/config.js +54 -0
  238. package/dist/s2/index.d.ts +6 -0
  239. package/dist/s2/index.js +6 -0
  240. package/dist/s2/lite.d.ts +26 -0
  241. package/dist/s2/lite.js +150 -0
  242. package/dist/s2/projector.d.ts +8 -0
  243. package/dist/s2/projector.js +28 -0
  244. package/dist/s2/serialize.d.ts +1 -0
  245. package/dist/s2/serialize.js +1 -0
  246. package/dist/s2/snapshot-store.d.ts +17 -0
  247. package/dist/s2/snapshot-store.js +320 -0
  248. package/dist/s2/store.d.ts +35 -0
  249. package/dist/s2/store.js +337 -0
  250. package/dist/testing/index.d.ts +11 -0
  251. package/dist/testing/index.js +63 -0
  252. package/dist/workflow/definitions-store.d.ts +11 -0
  253. package/dist/workflow/definitions-store.js +8 -0
  254. package/dist/workflow/definitions.d.ts +82 -0
  255. package/dist/workflow/definitions.js +32 -0
  256. package/dist/workflow/effects.d.ts +305 -0
  257. package/dist/workflow/effects.js +208 -0
  258. package/dist/workflow/events.d.ts +60 -0
  259. package/dist/workflow/events.js +39 -0
  260. package/dist/workflow/index.d.ts +8 -0
  261. package/dist/workflow/index.js +8 -0
  262. package/dist/workflow/module.d.ts +926 -0
  263. package/dist/workflow/module.js +19 -0
  264. package/dist/workflow/projections.d.ts +30 -0
  265. package/dist/workflow/projections.js +43 -0
  266. package/dist/workflow/scope.d.ts +61 -0
  267. package/dist/workflow/scope.js +7 -0
  268. package/dist/workflow/threads.d.ts +171 -0
  269. package/dist/workflow/threads.js +287 -0
  270. package/package.json +183 -0
@@ -0,0 +1,27 @@
1
+ import { Layer } from 'effect';
2
+ import { defineModule } from '@swirls/looms/core';
3
+ import { AgentDefinitionsLive } from './definitions-store.js';
4
+ import { callLlmEffect, executeToolEffect } from './effects.js';
5
+ import { llmFromAdapter, LlmTag, StubLlmLive } from './llm.js';
6
+ import { conversation, tokenUsage } from './projections.js';
7
+ import { agentModule } from './scope.js';
8
+ import { agentThread } from './threads.js';
9
+ export function agent(options = {}) {
10
+ const definitions = options.definitions ?? [];
11
+ const llmLayer = options.llm
12
+ ? Layer.succeed(LlmTag, llmFromAdapter(options.llm))
13
+ : StubLlmLive(options.llmPolicy);
14
+ return defineModule(agentModule, () => ({
15
+ definitions,
16
+ threads: { agent: agentThread },
17
+ effects: {
18
+ callLLM: callLlmEffect,
19
+ executeTool: executeToolEffect,
20
+ },
21
+ projections: {
22
+ conversation,
23
+ tokenUsage,
24
+ },
25
+ services: () => Layer.merge(llmLayer, AgentDefinitionsLive(definitions)),
26
+ }));
27
+ }
@@ -0,0 +1,17 @@
1
+ export declare const conversation: import("@swirls/looms/core").ProjectionDefinition<{
2
+ readonly lines: {
3
+ readonly role: "assistant" | "system" | "tool" | "user";
4
+ readonly content: string;
5
+ readonly toolCallId?: string | undefined;
6
+ readonly name?: string | undefined;
7
+ readonly toolCalls?: {
8
+ readonly id: string;
9
+ readonly name: string;
10
+ readonly arguments: import("effect/Schema").Json;
11
+ }[] | undefined;
12
+ }[];
13
+ }>;
14
+ export declare const tokenUsage: import("@swirls/looms/core").ProjectionDefinition<{
15
+ readonly input: number;
16
+ readonly output: number;
17
+ }>;
@@ -0,0 +1,81 @@
1
+ import { Predicate } from 'effect';
2
+ import { agentModule } from './scope.js';
3
+ import { ConversationSchema, TokenUsageSchema } from './types.js';
4
+ export const conversation = agentModule.projection({
5
+ name: 'conversation',
6
+ shape: ConversationSchema,
7
+ initialState: { lines: [] },
8
+ reduce(state, event) {
9
+ switch (event.type) {
10
+ case 'agent.message.received':
11
+ case 'agent.message':
12
+ case 'agent.steered': {
13
+ const raw = event.payload.message;
14
+ if (!raw) {
15
+ return state;
16
+ }
17
+ const role = raw.role === 'system' || raw.role === 'assistant' || raw.role === 'tool'
18
+ ? raw.role
19
+ : 'user';
20
+ let toolCalls;
21
+ const calls = raw.toolCalls;
22
+ if (Array.isArray(calls)) {
23
+ const collected = [];
24
+ for (const item of calls) {
25
+ if (!Predicate.isObject(item) ||
26
+ !Predicate.isString(item.id) ||
27
+ !Predicate.isString(item.name)) {
28
+ continue;
29
+ }
30
+ collected.push({ id: item.id, name: item.name, arguments: item.arguments ?? null });
31
+ }
32
+ if (collected.length > 0) {
33
+ toolCalls = collected;
34
+ }
35
+ }
36
+ const line = {
37
+ role,
38
+ content: Predicate.isString(raw.content) ? raw.content : '',
39
+ toolCallId: raw.toolCallId ?? undefined,
40
+ name: raw.name ?? undefined,
41
+ toolCalls,
42
+ };
43
+ return { lines: [...state.lines, line] };
44
+ }
45
+ case 'agent.tool.result': {
46
+ const { error, result, toolCallId, name } = event.payload;
47
+ const content = Predicate.isString(error) && error.length > 0 ? error : JSON.stringify(result ?? null);
48
+ const toolLine = {
49
+ role: 'tool',
50
+ content,
51
+ toolCallId: toolCallId ?? undefined,
52
+ name: name ?? undefined,
53
+ toolCalls: undefined,
54
+ };
55
+ return {
56
+ lines: [...state.lines, toolLine],
57
+ };
58
+ }
59
+ default:
60
+ return state;
61
+ }
62
+ },
63
+ });
64
+ export const tokenUsage = agentModule.projection({
65
+ name: 'tokenUsage',
66
+ shape: TokenUsageSchema,
67
+ initialState: { input: 0, output: 0 },
68
+ reduce(state, event) {
69
+ if (event.type !== 'agent.message') {
70
+ return state;
71
+ }
72
+ const usage = event.payload.usage;
73
+ if (!usage) {
74
+ return state;
75
+ }
76
+ return {
77
+ input: state.input + (Predicate.isNumber(usage.input) ? usage.input : 0),
78
+ output: state.output + (Predicate.isNumber(usage.output) ? usage.output : 0),
79
+ };
80
+ },
81
+ });
@@ -0,0 +1,171 @@
1
+ import { type EventOf } from '@swirls/looms/core';
2
+ export declare const agentModule: import("@swirls/looms/core").ModuleScope<"agent", import("@swirls/looms/core").ScopeUniverse<import("@swirls/looms/core").EventCatalog<"agent", {
3
+ 'message.received': import("effect/Schema").Struct<{
4
+ readonly message: import("effect/Schema").Struct<{
5
+ readonly role: import("effect/Schema").Union<readonly [import("effect/Schema").Literal<"system">, import("effect/Schema").Literal<"user">, import("effect/Schema").Literal<"assistant">, import("effect/Schema").Literal<"tool">]>;
6
+ readonly content: import("effect/Schema").String;
7
+ readonly toolCallId: import("effect/Schema").optional<import("effect/Schema").String>;
8
+ readonly name: import("effect/Schema").optional<import("effect/Schema").String>;
9
+ readonly toolCalls: import("effect/Schema").optional<import("effect/Schema").mutable<import("effect/Schema").$Array<import("effect/Schema").Struct<{
10
+ readonly id: import("effect/Schema").String;
11
+ readonly name: import("effect/Schema").String;
12
+ readonly arguments: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
13
+ }>>>>;
14
+ }>;
15
+ }>;
16
+ 'turn.started': import("effect/Schema").Struct<{
17
+ readonly turn: import("effect/Schema").Number;
18
+ }>;
19
+ 'turn.text_delta': import("effect/Schema").Struct<{
20
+ readonly turn: import("effect/Schema").Number;
21
+ readonly delta: import("effect/Schema").String;
22
+ }>;
23
+ message: import("effect/Schema").Struct<{
24
+ readonly turn: import("effect/Schema").Number;
25
+ readonly message: import("effect/Schema").Struct<{
26
+ readonly role: import("effect/Schema").Union<readonly [import("effect/Schema").Literal<"system">, import("effect/Schema").Literal<"user">, import("effect/Schema").Literal<"assistant">, import("effect/Schema").Literal<"tool">]>;
27
+ readonly content: import("effect/Schema").String;
28
+ readonly toolCallId: import("effect/Schema").optional<import("effect/Schema").String>;
29
+ readonly name: import("effect/Schema").optional<import("effect/Schema").String>;
30
+ readonly toolCalls: import("effect/Schema").optional<import("effect/Schema").mutable<import("effect/Schema").$Array<import("effect/Schema").Struct<{
31
+ readonly id: import("effect/Schema").String;
32
+ readonly name: import("effect/Schema").String;
33
+ readonly arguments: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
34
+ }>>>>;
35
+ }>;
36
+ readonly usage: import("effect/Schema").optional<import("effect/Schema").Struct<{
37
+ readonly input: import("effect/Schema").Number;
38
+ readonly output: import("effect/Schema").Number;
39
+ }>>;
40
+ }>;
41
+ 'tool_call.requested': import("effect/Schema").Struct<{
42
+ readonly turn: import("effect/Schema").Number;
43
+ readonly toolCall: import("effect/Schema").Struct<{
44
+ readonly id: import("effect/Schema").String;
45
+ readonly name: import("effect/Schema").String;
46
+ readonly arguments: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
47
+ }>;
48
+ }>;
49
+ 'tool.result': import("effect/Schema").Struct<{
50
+ readonly turn: import("effect/Schema").Number;
51
+ readonly toolCallId: import("effect/Schema").String;
52
+ readonly name: import("effect/Schema").String;
53
+ readonly result: import("effect/Schema").NullOr<import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>>;
54
+ readonly error: import("effect/Schema").NullOr<import("effect/Schema").String>;
55
+ }>;
56
+ steered: import("effect/Schema").Struct<{
57
+ readonly turn: import("effect/Schema").Number;
58
+ readonly message: import("effect/Schema").Struct<{
59
+ readonly role: import("effect/Schema").Union<readonly [import("effect/Schema").Literal<"system">, import("effect/Schema").Literal<"user">, import("effect/Schema").Literal<"assistant">, import("effect/Schema").Literal<"tool">]>;
60
+ readonly content: import("effect/Schema").String;
61
+ readonly toolCallId: import("effect/Schema").optional<import("effect/Schema").String>;
62
+ readonly name: import("effect/Schema").optional<import("effect/Schema").String>;
63
+ readonly toolCalls: import("effect/Schema").optional<import("effect/Schema").mutable<import("effect/Schema").$Array<import("effect/Schema").Struct<{
64
+ readonly id: import("effect/Schema").String;
65
+ readonly name: import("effect/Schema").String;
66
+ readonly arguments: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
67
+ }>>>>;
68
+ }>;
69
+ readonly interrupt: import("effect/Schema").optional<import("effect/Schema").Boolean>;
70
+ }>;
71
+ 'spawn.requested': import("effect/Schema").Struct<{
72
+ readonly childThreadId: import("effect/Schema").String;
73
+ readonly kind: import("effect/Schema").String;
74
+ readonly definitionName: import("effect/Schema").String;
75
+ readonly toolCallId: import("effect/Schema").String;
76
+ readonly input: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
77
+ }>;
78
+ 'effects.requested': import("effect/Schema").Struct<{
79
+ readonly toolCallId: import("effect/Schema").String;
80
+ readonly effects: import("effect/Schema").$Array<import("effect/Schema").Schema<import("@swirls/looms/core").RuntimeEffect>>;
81
+ readonly waitOn: import("effect/Schema").optional<import("effect/Schema").Struct<{
82
+ readonly type: import("effect/Schema").Union<readonly [import("effect/Schema").String, import("effect/Schema").$Array<import("effect/Schema").String>]>;
83
+ readonly match: import("effect/Schema").optional<import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>>;
84
+ }>>;
85
+ }>;
86
+ }>, undefined>, import("@swirls/looms/core").EventCatalog<"agent", {
87
+ 'message.received': import("effect/Schema").Struct<{
88
+ readonly message: import("effect/Schema").Struct<{
89
+ readonly role: import("effect/Schema").Union<readonly [import("effect/Schema").Literal<"system">, import("effect/Schema").Literal<"user">, import("effect/Schema").Literal<"assistant">, import("effect/Schema").Literal<"tool">]>;
90
+ readonly content: import("effect/Schema").String;
91
+ readonly toolCallId: import("effect/Schema").optional<import("effect/Schema").String>;
92
+ readonly name: import("effect/Schema").optional<import("effect/Schema").String>;
93
+ readonly toolCalls: import("effect/Schema").optional<import("effect/Schema").mutable<import("effect/Schema").$Array<import("effect/Schema").Struct<{
94
+ readonly id: import("effect/Schema").String;
95
+ readonly name: import("effect/Schema").String;
96
+ readonly arguments: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
97
+ }>>>>;
98
+ }>;
99
+ }>;
100
+ 'turn.started': import("effect/Schema").Struct<{
101
+ readonly turn: import("effect/Schema").Number;
102
+ }>;
103
+ 'turn.text_delta': import("effect/Schema").Struct<{
104
+ readonly turn: import("effect/Schema").Number;
105
+ readonly delta: import("effect/Schema").String;
106
+ }>;
107
+ message: import("effect/Schema").Struct<{
108
+ readonly turn: import("effect/Schema").Number;
109
+ readonly message: import("effect/Schema").Struct<{
110
+ readonly role: import("effect/Schema").Union<readonly [import("effect/Schema").Literal<"system">, import("effect/Schema").Literal<"user">, import("effect/Schema").Literal<"assistant">, import("effect/Schema").Literal<"tool">]>;
111
+ readonly content: import("effect/Schema").String;
112
+ readonly toolCallId: import("effect/Schema").optional<import("effect/Schema").String>;
113
+ readonly name: import("effect/Schema").optional<import("effect/Schema").String>;
114
+ readonly toolCalls: import("effect/Schema").optional<import("effect/Schema").mutable<import("effect/Schema").$Array<import("effect/Schema").Struct<{
115
+ readonly id: import("effect/Schema").String;
116
+ readonly name: import("effect/Schema").String;
117
+ readonly arguments: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
118
+ }>>>>;
119
+ }>;
120
+ readonly usage: import("effect/Schema").optional<import("effect/Schema").Struct<{
121
+ readonly input: import("effect/Schema").Number;
122
+ readonly output: import("effect/Schema").Number;
123
+ }>>;
124
+ }>;
125
+ 'tool_call.requested': import("effect/Schema").Struct<{
126
+ readonly turn: import("effect/Schema").Number;
127
+ readonly toolCall: import("effect/Schema").Struct<{
128
+ readonly id: import("effect/Schema").String;
129
+ readonly name: import("effect/Schema").String;
130
+ readonly arguments: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
131
+ }>;
132
+ }>;
133
+ 'tool.result': import("effect/Schema").Struct<{
134
+ readonly turn: import("effect/Schema").Number;
135
+ readonly toolCallId: import("effect/Schema").String;
136
+ readonly name: import("effect/Schema").String;
137
+ readonly result: import("effect/Schema").NullOr<import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>>;
138
+ readonly error: import("effect/Schema").NullOr<import("effect/Schema").String>;
139
+ }>;
140
+ steered: import("effect/Schema").Struct<{
141
+ readonly turn: import("effect/Schema").Number;
142
+ readonly message: import("effect/Schema").Struct<{
143
+ readonly role: import("effect/Schema").Union<readonly [import("effect/Schema").Literal<"system">, import("effect/Schema").Literal<"user">, import("effect/Schema").Literal<"assistant">, import("effect/Schema").Literal<"tool">]>;
144
+ readonly content: import("effect/Schema").String;
145
+ readonly toolCallId: import("effect/Schema").optional<import("effect/Schema").String>;
146
+ readonly name: import("effect/Schema").optional<import("effect/Schema").String>;
147
+ readonly toolCalls: import("effect/Schema").optional<import("effect/Schema").mutable<import("effect/Schema").$Array<import("effect/Schema").Struct<{
148
+ readonly id: import("effect/Schema").String;
149
+ readonly name: import("effect/Schema").String;
150
+ readonly arguments: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
151
+ }>>>>;
152
+ }>;
153
+ readonly interrupt: import("effect/Schema").optional<import("effect/Schema").Boolean>;
154
+ }>;
155
+ 'spawn.requested': import("effect/Schema").Struct<{
156
+ readonly childThreadId: import("effect/Schema").String;
157
+ readonly kind: import("effect/Schema").String;
158
+ readonly definitionName: import("effect/Schema").String;
159
+ readonly toolCallId: import("effect/Schema").String;
160
+ readonly input: import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>;
161
+ }>;
162
+ 'effects.requested': import("effect/Schema").Struct<{
163
+ readonly toolCallId: import("effect/Schema").String;
164
+ readonly effects: import("effect/Schema").$Array<import("effect/Schema").Schema<import("@swirls/looms/core").RuntimeEffect>>;
165
+ readonly waitOn: import("effect/Schema").optional<import("effect/Schema").Struct<{
166
+ readonly type: import("effect/Schema").Union<readonly [import("effect/Schema").String, import("effect/Schema").$Array<import("effect/Schema").String>]>;
167
+ readonly match: import("effect/Schema").optional<import("effect/Schema").Codec<import("effect/Schema").Json, import("effect/Schema").Json, never, never>>;
168
+ }>>;
169
+ }>;
170
+ }>, undefined>;
171
+ export type AgentEvent = EventOf<typeof agentModule>;
@@ -0,0 +1,7 @@
1
+ import { createModuleScope } from '@swirls/looms/core';
2
+ import { agentCatalog } from './events.js';
3
+ export const agentModule = createModuleScope({
4
+ namespace: 'agent',
5
+ protocolVersion: '1.0.0',
6
+ events: agentCatalog,
7
+ });
@@ -0,0 +1,17 @@
1
+ import type { EventInput } from '@swirls/looms/core';
2
+ export interface AgentSignalOptions {
3
+ /** Target thread. Defaults to the run's root thread when omitted. */
4
+ readonly threadId?: string;
5
+ }
6
+ /**
7
+ * Build the `agent.message.received` event for a conversational agent.
8
+ * Send it with `looms.signal(runId, [userMessage('Also greet Maya')])`.
9
+ */
10
+ export declare function userMessage(content: string, options?: AgentSignalOptions): EventInput;
11
+ /**
12
+ * Build the `agent.steered` event: inject a user message mid-run, optionally
13
+ * interrupting the current turn so the agent replans immediately.
14
+ */
15
+ export declare function steer(content: string, options?: AgentSignalOptions & {
16
+ readonly interrupt?: boolean;
17
+ }): EventInput;
@@ -0,0 +1,19 @@
1
+ import { agentModule } from './scope.js';
2
+ /**
3
+ * Build the `agent.message.received` event for a conversational agent.
4
+ * Send it with `looms.signal(runId, [userMessage('Also greet Maya')])`.
5
+ */
6
+ export function userMessage(content, options = {}) {
7
+ return agentModule.input('message.received', { message: { role: 'user', content } }, { threadId: options.threadId });
8
+ }
9
+ /**
10
+ * Build the `agent.steered` event: inject a user message mid-run, optionally
11
+ * interrupting the current turn so the agent replans immediately.
12
+ */
13
+ export function steer(content, options = {}) {
14
+ return agentModule.input('steered', {
15
+ turn: 0,
16
+ interrupt: options.interrupt ?? true,
17
+ message: { role: 'user', content },
18
+ }, { threadId: options.threadId });
19
+ }
@@ -0,0 +1,12 @@
1
+ import type { AgentTurnResult } from './definitions';
2
+ import type { Message, ToolCall } from './types';
3
+ export interface StopWhenContext {
4
+ readonly turn: number;
5
+ readonly maxTurns: number;
6
+ readonly messages: Message[];
7
+ readonly toolCalls: ToolCall[];
8
+ readonly result: AgentTurnResult;
9
+ }
10
+ export type StopWhen = (ctx: StopWhenContext) => boolean;
11
+ export declare function hasToolCall(name: string): StopWhen;
12
+ export declare function stepCountIs(n: number): StopWhen;
@@ -0,0 +1,6 @@
1
+ export function hasToolCall(name) {
2
+ return (ctx) => ctx.toolCalls.some((toolCall) => toolCall.name === name);
3
+ }
4
+ export function stepCountIs(n) {
5
+ return (ctx) => ctx.turn >= n;
6
+ }
@@ -0,0 +1,34 @@
1
+ import { type EventEnvelope, type JsonValue, type RuntimeEffect } from '@swirls/looms/core';
2
+ import { type Message, type ToolCall } from './types';
3
+ export declare const agentThread: import("@swirls/looms/core").ThreadDefinition<{
4
+ definitionName?: string;
5
+ lines: Message[];
6
+ pendingToolCalls: ToolCall[];
7
+ executingToolCalls: ToolCall[];
8
+ needsLlmCall: boolean;
9
+ turn: number;
10
+ maxTurns: number;
11
+ pendingSteer: Message | null;
12
+ input: JsonValue;
13
+ output: JsonValue | null;
14
+ pendingEffectTools: {
15
+ [causingSeq: string]: import("./types").PendingEffectTool;
16
+ };
17
+ pendingSpawns: import("./types").AgentPendingSpawn[];
18
+ pendingEffects: import("./types").AgentPendingEffects[];
19
+ pendingEmits: (import("./types").AgentPendingEmit | {
20
+ id: string;
21
+ event: {
22
+ type: string;
23
+ payload: {
24
+ turn: number;
25
+ toolCallId: string;
26
+ name: string;
27
+ result: string | number | boolean | import("effect/Schema").JsonArray | import("effect/Schema").JsonObject | null;
28
+ error: string | null;
29
+ };
30
+ threadId: string;
31
+ };
32
+ })[];
33
+ }>;
34
+ export declare function satisfiedToToolResult(event: EventEnvelope): RuntimeEffect | null;