@yolk-sdk/agent 0.0.1-canary.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 (161) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +93 -0
  3. package/dist/client/index.d.mts +3 -0
  4. package/dist/client/index.mjs +3 -0
  5. package/dist/client/state.d.mts +99 -0
  6. package/dist/client/state.d.mts.map +1 -0
  7. package/dist/client/state.mjs +245 -0
  8. package/dist/client/state.mjs.map +1 -0
  9. package/dist/client/transport.d.mts +67 -0
  10. package/dist/client/transport.d.mts.map +1 -0
  11. package/dist/client/transport.mjs +219 -0
  12. package/dist/client/transport.mjs.map +1 -0
  13. package/dist/index.d.mts +1 -0
  14. package/dist/index.mjs +1 -0
  15. package/dist/loop/accumulator.d.mts +11 -0
  16. package/dist/loop/accumulator.d.mts.map +1 -0
  17. package/dist/loop/accumulator.mjs +40 -0
  18. package/dist/loop/accumulator.mjs.map +1 -0
  19. package/dist/loop/error.d.mts +36 -0
  20. package/dist/loop/error.d.mts.map +1 -0
  21. package/dist/loop/error.mjs +84 -0
  22. package/dist/loop/error.mjs.map +1 -0
  23. package/dist/loop/index.d.mts +9 -0
  24. package/dist/loop/index.mjs +9 -0
  25. package/dist/loop/llm-event.d.mts +44 -0
  26. package/dist/loop/llm-event.d.mts.map +1 -0
  27. package/dist/loop/llm-event.mjs +34 -0
  28. package/dist/loop/llm-event.mjs.map +1 -0
  29. package/dist/loop/run.d.mts +37 -0
  30. package/dist/loop/run.d.mts.map +1 -0
  31. package/dist/loop/run.mjs +624 -0
  32. package/dist/loop/run.mjs.map +1 -0
  33. package/dist/loop/services/context-transformer.d.mts +18 -0
  34. package/dist/loop/services/context-transformer.d.mts.map +1 -0
  35. package/dist/loop/services/context-transformer.mjs +12 -0
  36. package/dist/loop/services/context-transformer.mjs.map +1 -0
  37. package/dist/loop/services/llm-provider.d.mts +20 -0
  38. package/dist/loop/services/llm-provider.d.mts.map +1 -0
  39. package/dist/loop/services/llm-provider.mjs +7 -0
  40. package/dist/loop/services/llm-provider.mjs.map +1 -0
  41. package/dist/loop/services/loop-config.d.mts +17 -0
  42. package/dist/loop/services/loop-config.d.mts.map +1 -0
  43. package/dist/loop/services/loop-config.mjs +15 -0
  44. package/dist/loop/services/loop-config.mjs.map +1 -0
  45. package/dist/loop/services/tool-executor.d.mts +12 -0
  46. package/dist/loop/services/tool-executor.d.mts.map +1 -0
  47. package/dist/loop/services/tool-executor.mjs +7 -0
  48. package/dist/loop/services/tool-executor.mjs.map +1 -0
  49. package/dist/loop/testing/faux-provider.d.mts +31 -0
  50. package/dist/loop/testing/faux-provider.d.mts.map +1 -0
  51. package/dist/loop/testing/faux-provider.mjs +47 -0
  52. package/dist/loop/testing/faux-provider.mjs.map +1 -0
  53. package/dist/loop/testing/index.d.mts +3 -0
  54. package/dist/loop/testing/index.mjs +3 -0
  55. package/dist/loop/testing/test-tool-executor.d.mts +10 -0
  56. package/dist/loop/testing/test-tool-executor.d.mts.map +1 -0
  57. package/dist/loop/testing/test-tool-executor.mjs +21 -0
  58. package/dist/loop/testing/test-tool-executor.mjs.map +1 -0
  59. package/dist/protocol/capability.d.mts +20 -0
  60. package/dist/protocol/capability.d.mts.map +1 -0
  61. package/dist/protocol/capability.mjs +34 -0
  62. package/dist/protocol/capability.mjs.map +1 -0
  63. package/dist/protocol/content.d.mts +31 -0
  64. package/dist/protocol/content.d.mts.map +1 -0
  65. package/dist/protocol/content.mjs +52 -0
  66. package/dist/protocol/content.mjs.map +1 -0
  67. package/dist/protocol/event.d.mts +228 -0
  68. package/dist/protocol/event.d.mts.map +1 -0
  69. package/dist/protocol/event.mjs +217 -0
  70. package/dist/protocol/event.mjs.map +1 -0
  71. package/dist/protocol/index.d.mts +14 -0
  72. package/dist/protocol/index.d.mts.map +1 -0
  73. package/dist/protocol/index.mjs +9 -0
  74. package/dist/protocol/message.d.mts +53 -0
  75. package/dist/protocol/message.d.mts.map +1 -0
  76. package/dist/protocol/message.mjs +49 -0
  77. package/dist/protocol/message.mjs.map +1 -0
  78. package/dist/protocol/reasoning.d.mts +8 -0
  79. package/dist/protocol/reasoning.d.mts.map +1 -0
  80. package/dist/protocol/reasoning.mjs +13 -0
  81. package/dist/protocol/reasoning.mjs.map +1 -0
  82. package/dist/protocol/session.d.mts +39 -0
  83. package/dist/protocol/session.d.mts.map +1 -0
  84. package/dist/protocol/session.mjs +38 -0
  85. package/dist/protocol/session.mjs.map +1 -0
  86. package/dist/protocol/tool.d.mts +101 -0
  87. package/dist/protocol/tool.d.mts.map +1 -0
  88. package/dist/protocol/tool.mjs +102 -0
  89. package/dist/protocol/tool.mjs.map +1 -0
  90. package/dist/protocol/usage.d.mts +26 -0
  91. package/dist/protocol/usage.d.mts.map +1 -0
  92. package/dist/protocol/usage.mjs +40 -0
  93. package/dist/protocol/usage.mjs.map +1 -0
  94. package/dist/runtime/error.d.mts +29 -0
  95. package/dist/runtime/error.d.mts.map +1 -0
  96. package/dist/runtime/error.mjs +46 -0
  97. package/dist/runtime/error.mjs.map +1 -0
  98. package/dist/runtime/index.d.mts +9 -0
  99. package/dist/runtime/index.d.mts.map +1 -0
  100. package/dist/runtime/index.mjs +4 -0
  101. package/dist/runtime/run-runtime.d.mts +47 -0
  102. package/dist/runtime/run-runtime.d.mts.map +1 -0
  103. package/dist/runtime/run-runtime.mjs +112 -0
  104. package/dist/runtime/run-runtime.mjs.map +1 -0
  105. package/dist/runtime/session-event-store.d.mts +75 -0
  106. package/dist/runtime/session-event-store.d.mts.map +1 -0
  107. package/dist/runtime/session-event-store.mjs +124 -0
  108. package/dist/runtime/session-event-store.mjs.map +1 -0
  109. package/dist/tools/index.d.mts +4 -0
  110. package/dist/tools/index.mjs +4 -0
  111. package/dist/tools/question.d.mts +21 -0
  112. package/dist/tools/question.d.mts.map +1 -0
  113. package/dist/tools/question.mjs +41 -0
  114. package/dist/tools/question.mjs.map +1 -0
  115. package/dist/tools/registry.d.mts +61 -0
  116. package/dist/tools/registry.d.mts.map +1 -0
  117. package/dist/tools/registry.mjs +113 -0
  118. package/dist/tools/registry.mjs.map +1 -0
  119. package/dist/tools/task.d.mts +34 -0
  120. package/dist/tools/task.d.mts.map +1 -0
  121. package/dist/tools/task.mjs +81 -0
  122. package/dist/tools/task.mjs.map +1 -0
  123. package/package.json +86 -0
  124. package/src/client/README.md +23 -0
  125. package/src/client/index.ts +43 -0
  126. package/src/client/state.ts +380 -0
  127. package/src/client/transport.ts +517 -0
  128. package/src/index.ts +2 -0
  129. package/src/loop/README.md +23 -0
  130. package/src/loop/accumulator.ts +71 -0
  131. package/src/loop/error.ts +105 -0
  132. package/src/loop/index.ts +35 -0
  133. package/src/loop/llm-event.ts +52 -0
  134. package/src/loop/run.ts +1237 -0
  135. package/src/loop/services/context-transformer.ts +24 -0
  136. package/src/loop/services/llm-provider.ts +20 -0
  137. package/src/loop/services/loop-config.ts +20 -0
  138. package/src/loop/services/tool-executor.ts +11 -0
  139. package/src/loop/testing/faux-provider.ts +94 -0
  140. package/src/loop/testing/index.ts +3 -0
  141. package/src/loop/testing/test-tool-executor.ts +28 -0
  142. package/src/protocol/README.md +24 -0
  143. package/src/protocol/capability.ts +29 -0
  144. package/src/protocol/content.ts +76 -0
  145. package/src/protocol/event.ts +286 -0
  146. package/src/protocol/index.ts +109 -0
  147. package/src/protocol/message.ts +86 -0
  148. package/src/protocol/reasoning.ts +4 -0
  149. package/src/protocol/session.ts +47 -0
  150. package/src/protocol/tool.ts +154 -0
  151. package/src/protocol/usage.ts +48 -0
  152. package/src/runtime/README.md +44 -0
  153. package/src/runtime/error.ts +70 -0
  154. package/src/runtime/index.ts +43 -0
  155. package/src/runtime/run-runtime.ts +307 -0
  156. package/src/runtime/session-event-store.ts +254 -0
  157. package/src/tools/README.md +22 -0
  158. package/src/tools/index.ts +29 -0
  159. package/src/tools/question.ts +58 -0
  160. package/src/tools/registry.ts +228 -0
  161. package/src/tools/task.ts +132 -0
@@ -0,0 +1,113 @@
1
+ import { Array as Array$1, Effect, Layer, Option } from "effect";
2
+ import * as Schema from "effect/Schema";
3
+ import { ToolDef } from "@yolk-sdk/agent/protocol";
4
+ import { ToolError, ToolExecutor } from "@yolk-sdk/agent/loop";
5
+ //#region src/tools/registry.ts
6
+ const ToolAccess = Schema.Literals([
7
+ "read",
8
+ "write",
9
+ "destructive"
10
+ ]);
11
+ var ToolRegistryError = class extends Schema.TaggedErrorClass()("ToolRegistryError", {
12
+ message: Schema.String,
13
+ cause: Schema.Literals(["duplicate_tool"])
14
+ }) {};
15
+ const EmptyToolParams = Schema.Record(Schema.String, Schema.Never);
16
+ const enabled = (tool, context) => tool.isEnabled === void 0 ? Effect.succeed(true) : tool.isEnabled(context);
17
+ const resolveModuleTools = (toolModule, context) => Effect.forEach(toolModule.tools, (tool) => enabled(tool, context).pipe(Effect.map((isToolEnabled) => isToolEnabled ? Option.some({
18
+ moduleId: toolModule.id,
19
+ tool
20
+ }) : Option.none()))).pipe(Effect.map(Array$1.getSomes));
21
+ const duplicateToolError = (name) => new ToolRegistryError({
22
+ cause: "duplicate_tool",
23
+ message: `Duplicate tool registered: ${name}`
24
+ });
25
+ const missingToolError = (name) => new ToolError({
26
+ tool: name,
27
+ message: `Tool is not configured: ${name}`,
28
+ cause: "not_found"
29
+ });
30
+ const unknownToMessage = (error) => error instanceof Error ? error.message : String(error);
31
+ const objectField = (input, key) => input !== null && typeof input === "object" ? Object.getOwnPropertyDescriptor(input, key)?.value : void 0;
32
+ const isObjectRecord = (input) => input !== null && typeof input === "object" && !Array.isArray(input);
33
+ const localDefinitionName = (ref) => {
34
+ if (typeof ref !== "string") return;
35
+ return ref.startsWith("#/$defs/") ? ref.slice(8) : void 0;
36
+ };
37
+ const hasJsonSchemaType = (input, type) => objectField(input, "type") === type;
38
+ const isEmptyStructJsonSchema = (schema) => {
39
+ const anyOf = objectField(schema, "anyOf");
40
+ return Array.isArray(anyOf) && anyOf.length === 2 && anyOf.some((item) => hasJsonSchemaType(item, "object")) && anyOf.some((item) => hasJsonSchemaType(item, "array"));
41
+ };
42
+ const isEmptyRecordJsonSchema = (schema) => hasJsonSchemaType(schema, "object") && objectField(schema, "additionalProperties") === false && objectField(schema, "properties") === void 0 && objectField(schema, "required") === void 0;
43
+ const emptyObjectJsonSchema = {
44
+ type: "object",
45
+ properties: {},
46
+ required: [],
47
+ additionalProperties: false
48
+ };
49
+ const jsonSchemaFromSchema = (schema) => {
50
+ const document = Schema.toJsonSchemaDocument(schema);
51
+ const definitionName = localDefinitionName(objectField(document.schema, "$ref"));
52
+ const localDefinition = definitionName === void 0 ? void 0 : Object.getOwnPropertyDescriptor(document.definitions, definitionName)?.value;
53
+ const rootSchema = isObjectRecord(localDefinition) ? localDefinition : document.schema;
54
+ const remainingDefinitions = definitionName === void 0 ? document.definitions : Object.fromEntries(Object.entries(document.definitions).filter(([name]) => name !== definitionName));
55
+ const jsonSchema = isEmptyStructJsonSchema(rootSchema) || isEmptyRecordJsonSchema(rootSchema) ? emptyObjectJsonSchema : rootSchema;
56
+ return Object.keys(remainingDefinitions).length > 0 ? {
57
+ ...jsonSchema,
58
+ $defs: remainingDefinitions
59
+ } : jsonSchema;
60
+ };
61
+ const makeTool = (options) => ({
62
+ def: ToolDef.make({
63
+ name: options.name,
64
+ description: options.description,
65
+ parameters: jsonSchemaFromSchema(options.parameters),
66
+ approval: options.approval
67
+ }),
68
+ access: options.access,
69
+ approval: options.approval,
70
+ isEnabled: options.isEnabled,
71
+ execute: ({ call, context }) => Schema.decodeUnknownEffect(options.parameters)(call.params).pipe(Effect.mapError((error) => new ToolError({
72
+ tool: options.name,
73
+ message: options.invalidParamsMessage?.(error) ?? `Invalid ${options.name} arguments: ${unknownToMessage(error)}`,
74
+ cause: "validation"
75
+ })), Effect.flatMap((params) => options.execute({
76
+ call,
77
+ context,
78
+ params
79
+ })))
80
+ });
81
+ const findDuplicateToolName = (resolved) => {
82
+ const names = Array$1.map(resolved, (item) => item.tool.def.name);
83
+ return Array$1.findFirst(names, (name, index) => names.indexOf(name) !== index);
84
+ };
85
+ const resolveTools = (modules, context) => Effect.gen(function* () {
86
+ const resolvedByModule = yield* Effect.forEach(modules, (toolModule) => resolveModuleTools(toolModule, context));
87
+ const resolved = Array$1.flatten(resolvedByModule);
88
+ const duplicateName = findDuplicateToolName(resolved);
89
+ if (Option.isSome(duplicateName)) return yield* Effect.fail(duplicateToolError(duplicateName.value));
90
+ const tools = Array$1.map(resolved, (item) => item.tool.def);
91
+ const metadata = Array$1.map(resolved, (item) => ({
92
+ moduleId: item.moduleId,
93
+ name: item.tool.def.name,
94
+ access: item.tool.access
95
+ }));
96
+ const execute = (call) => Option.match(Array$1.findFirst(resolved, (item) => item.tool.def.name === call.name), {
97
+ onNone: () => Effect.fail(missingToolError(call.name)),
98
+ onSome: (match) => match.tool.execute({
99
+ call,
100
+ context
101
+ })
102
+ });
103
+ return {
104
+ tools,
105
+ metadata,
106
+ execute
107
+ };
108
+ });
109
+ const makeToolExecutorLayer = (toolSet) => Layer.succeed(ToolExecutor, ToolExecutor.of({ execute: toolSet.execute }));
110
+ //#endregion
111
+ export { EmptyToolParams, ToolAccess, ToolRegistryError, makeTool, makeToolExecutorLayer, resolveTools };
112
+
113
+ //# sourceMappingURL=registry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.mjs","names":["Arr"],"sources":["../../src/tools/registry.ts"],"sourcesContent":["import { Array as Arr, Effect, Layer, Option } from 'effect'\nimport * as Schema from 'effect/Schema'\nimport { ToolError, ToolExecutor } from '@yolk-sdk/agent/loop'\nimport { ToolDef, type ToolApprovalPolicy, type ToolCall, type ToolResult } from '@yolk-sdk/agent/protocol'\n\nexport const ToolAccess = Schema.Literals(['read', 'write', 'destructive'])\nexport type ToolAccess = typeof ToolAccess.Type\n\nexport class ToolRegistryError extends Schema.TaggedErrorClass<ToolRegistryError>()(\n 'ToolRegistryError',\n {\n message: Schema.String,\n cause: Schema.Literals(['duplicate_tool'])\n }\n) {}\n\nexport type ToolExecutionInput<Context> = {\n readonly call: ToolCall\n readonly context: Context\n}\n\nexport type SchemaToolExecutionInput<Context, Params> = ToolExecutionInput<Context> & {\n readonly params: Params\n}\n\nexport type ToolRegistration<Context> = {\n readonly def: ToolDef\n readonly access: ToolAccess\n readonly approval?: ToolApprovalPolicy\n readonly isEnabled?: (context: Context) => Effect.Effect<boolean, ToolRegistryError>\n readonly execute: (input: ToolExecutionInput<Context>) => Effect.Effect<ToolResult, ToolError>\n}\n\ntype ToolParamsSchema = Schema.Schema<unknown> & { readonly DecodingServices: never }\n\nexport const EmptyToolParams = Schema.Record(Schema.String, Schema.Never)\n\nexport type MakeToolOptions<Context, ParamsSchema extends ToolParamsSchema> = {\n readonly name: string\n readonly description: string\n readonly parameters: ParamsSchema\n readonly access: ToolAccess\n readonly approval?: ToolApprovalPolicy\n readonly isEnabled?: (context: Context) => Effect.Effect<boolean, ToolRegistryError>\n readonly invalidParamsMessage?: (error: unknown) => string\n readonly execute: (\n input: SchemaToolExecutionInput<Context, ParamsSchema['Type']>\n ) => Effect.Effect<ToolResult, ToolError>\n}\n\nexport type ToolModule<Context> = {\n readonly id: string\n readonly tools: ReadonlyArray<ToolRegistration<Context>>\n}\n\nexport type ToolMetadata = {\n readonly moduleId: string\n readonly name: string\n readonly access: ToolAccess\n}\n\ntype ResolvedRegistration<Context> = {\n readonly moduleId: string\n readonly tool: ToolRegistration<Context>\n}\n\nexport type ResolvedToolSet = {\n readonly tools: ReadonlyArray<ToolDef>\n readonly metadata: ReadonlyArray<ToolMetadata>\n readonly execute: (call: ToolCall) => Effect.Effect<ToolResult, ToolError>\n}\n\nconst enabled = <Context>(tool: ToolRegistration<Context>, context: Context) =>\n tool.isEnabled === undefined ? Effect.succeed(true) : tool.isEnabled(context)\n\nconst resolveModuleTools = <Context>(toolModule: ToolModule<Context>, context: Context) =>\n Effect.forEach(toolModule.tools, tool =>\n enabled(tool, context).pipe(\n Effect.map(isToolEnabled =>\n isToolEnabled ? Option.some({ moduleId: toolModule.id, tool }) : Option.none()\n )\n )\n ).pipe(Effect.map(Arr.getSomes))\n\nconst duplicateToolError = (name: string) =>\n new ToolRegistryError({\n cause: 'duplicate_tool',\n message: `Duplicate tool registered: ${name}`\n })\n\nconst missingToolError = (name: string) =>\n new ToolError({\n tool: name,\n message: `Tool is not configured: ${name}`,\n cause: 'not_found'\n })\n\nconst unknownToMessage = (error: unknown) =>\n error instanceof Error ? error.message : String(error)\n\nconst objectField = (input: unknown, key: string) =>\n input !== null && typeof input === 'object' ? Object.getOwnPropertyDescriptor(input, key)?.value : undefined\n\nconst isObjectRecord = (input: unknown): input is Readonly<Record<string, unknown>> =>\n input !== null && typeof input === 'object' && !Array.isArray(input)\n\nconst localDefinitionName = (ref: unknown) => {\n if (typeof ref !== 'string') {\n return undefined\n }\n\n const prefix = '#/$defs/'\n\n return ref.startsWith(prefix) ? ref.slice(prefix.length) : undefined\n}\n\nconst hasJsonSchemaType = (input: unknown, type: string) => objectField(input, 'type') === type\n\nconst isEmptyStructJsonSchema = (schema: unknown) => {\n const anyOf = objectField(schema, 'anyOf')\n\n return Array.isArray(anyOf) &&\n anyOf.length === 2 &&\n anyOf.some(item => hasJsonSchemaType(item, 'object')) &&\n anyOf.some(item => hasJsonSchemaType(item, 'array'))\n}\n\nconst isEmptyRecordJsonSchema = (schema: unknown) =>\n hasJsonSchemaType(schema, 'object') &&\n objectField(schema, 'additionalProperties') === false &&\n objectField(schema, 'properties') === undefined &&\n objectField(schema, 'required') === undefined\n\nconst emptyObjectJsonSchema = {\n type: 'object',\n properties: {},\n required: [],\n additionalProperties: false\n}\n\nconst jsonSchemaFromSchema = (schema: Schema.Top) => {\n const document = Schema.toJsonSchemaDocument(schema)\n const definitionName = localDefinitionName(objectField(document.schema, '$ref'))\n const localDefinition = definitionName === undefined\n ? undefined\n : Object.getOwnPropertyDescriptor(document.definitions, definitionName)?.value\n const rootSchema = isObjectRecord(localDefinition) ? localDefinition : document.schema\n const remainingDefinitions = definitionName === undefined\n ? document.definitions\n : Object.fromEntries(\n Object.entries(document.definitions).filter(([name]) => name !== definitionName)\n )\n const jsonSchema = isEmptyStructJsonSchema(rootSchema) || isEmptyRecordJsonSchema(rootSchema)\n ? emptyObjectJsonSchema\n : rootSchema\n\n return Object.keys(remainingDefinitions).length > 0\n ? { ...jsonSchema, $defs: remainingDefinitions }\n : jsonSchema\n}\n\nexport const makeTool = <Context, ParamsSchema extends ToolParamsSchema>(\n options: MakeToolOptions<Context, ParamsSchema>\n): ToolRegistration<Context> => ({\n def: ToolDef.make({\n name: options.name,\n description: options.description,\n parameters: jsonSchemaFromSchema(options.parameters),\n approval: options.approval\n }),\n access: options.access,\n approval: options.approval,\n isEnabled: options.isEnabled,\n execute: ({ call, context }) =>\n Schema.decodeUnknownEffect(options.parameters)(call.params).pipe(\n Effect.mapError(error =>\n new ToolError({\n tool: options.name,\n message: options.invalidParamsMessage?.(error) ?? `Invalid ${options.name} arguments: ${unknownToMessage(error)}`,\n cause: 'validation'\n })\n ),\n Effect.flatMap(params => options.execute({ call, context, params }))\n )\n})\n\nconst findDuplicateToolName = <Context>(resolved: ReadonlyArray<ResolvedRegistration<Context>>) => {\n const names = Arr.map(resolved, item => item.tool.def.name)\n\n return Arr.findFirst(names, (name, index) => names.indexOf(name) !== index)\n}\n\nexport const resolveTools = <Context>(\n modules: ReadonlyArray<ToolModule<Context>>,\n context: Context\n): Effect.Effect<ResolvedToolSet, ToolRegistryError> =>\n Effect.gen(function* () {\n const resolvedByModule = yield* Effect.forEach(modules, toolModule =>\n resolveModuleTools(toolModule, context)\n )\n const resolved = Arr.flatten(resolvedByModule)\n const duplicateName = findDuplicateToolName(resolved)\n\n if (Option.isSome(duplicateName)) {\n return yield* Effect.fail(duplicateToolError(duplicateName.value))\n }\n\n const tools = Arr.map(resolved, item => item.tool.def)\n const metadata = Arr.map(resolved, item => ({\n moduleId: item.moduleId,\n name: item.tool.def.name,\n access: item.tool.access\n }))\n\n const execute = (call: ToolCall) =>\n Option.match(\n Arr.findFirst(resolved, item => item.tool.def.name === call.name),\n {\n onNone: () => Effect.fail(missingToolError(call.name)),\n onSome: match => match.tool.execute({ call, context })\n }\n )\n\n return { tools, metadata, execute }\n })\n\nexport const makeToolExecutorLayer = (toolSet: ResolvedToolSet) =>\n Layer.succeed(ToolExecutor, ToolExecutor.of({ execute: toolSet.execute }))\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { ToolModule, ToolRegistration } from "./registry.mjs";
2
+ import { Effect } from "effect";
3
+ import * as Schema from "effect/Schema";
4
+ import { ToolCall, ToolResult } from "@yolk-sdk/agent/protocol";
5
+ import { ToolError } from "@yolk-sdk/agent/loop";
6
+
7
+ //#region src/tools/task.d.ts
8
+ declare const taskToolName = "task";
9
+ declare const TaskToolParams: Schema.Struct<{
10
+ readonly description: Schema.String;
11
+ readonly prompt: Schema.String;
12
+ readonly subagent_type: Schema.String;
13
+ }>;
14
+ type TaskToolParams = typeof TaskToolParams.Type;
15
+ type TaskSubagentDefinition = {
16
+ readonly name: string;
17
+ readonly description: string;
18
+ };
19
+ type TaskExecutionInput<Context> = {
20
+ readonly call: ToolCall;
21
+ readonly context: Context;
22
+ readonly params: TaskToolParams;
23
+ };
24
+ type TaskToolOptions<Context> = {
25
+ readonly subagents: ReadonlyArray<TaskSubagentDefinition>;
26
+ readonly execute: (input: TaskExecutionInput<Context>) => Effect.Effect<ToolResult, ToolError>;
27
+ };
28
+ declare const makeTaskToolRegistration: <Context>(options: TaskToolOptions<Context>) => ToolRegistration<Context>;
29
+ declare const makeTaskToolDef: (subagents: ReadonlyArray<TaskSubagentDefinition>) => import("@yolk-sdk/agent/protocol").ToolDef;
30
+ declare const makeTaskToolModule: <Context>(options: TaskToolOptions<Context>) => ToolModule<Context>;
31
+ declare const formatTaskResult: (output: string) => string;
32
+ //#endregion
33
+ export { TaskExecutionInput, TaskSubagentDefinition, TaskToolOptions, TaskToolParams, formatTaskResult, makeTaskToolDef, makeTaskToolModule, makeTaskToolRegistration, taskToolName };
34
+ //# sourceMappingURL=task.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.d.mts","names":[],"sources":["../../src/tools/task.ts"],"mappings":";;;;;;;cAMa,YAAA;AAAA,cAEP,cAAA,EAAc,MAAA,CAAA,MAAA;EAAA;;;;KAYR,cAAA,UAAwB,cAAA,CAAe,IAAI;AAAA,KAE3C,sBAAA;EAAA,SACD,IAAA;EAAA,SACA,WAAW;AAAA;AAAA,KAGV,kBAAA;EAAA,SACD,IAAA,EAAM,QAAA;EAAA,SACN,OAAA,EAAS,OAAA;EAAA,SACT,MAAA,EAAQ,cAAA;AAAA;AAAA,KAGP,eAAA;EAAA,SACD,SAAA,EAAW,aAAA,CAAc,sBAAA;EAAA,SACzB,OAAA,GAAU,KAAA,EAAO,kBAAA,CAAmB,OAAA,MAAa,MAAA,CAAO,MAAA,CAAO,UAAA,EAAY,SAAA;AAAA;AAAA,cAgEzE,wBAAA,YACX,OAAA,EAAS,eAAA,CAAgB,OAAA,MACxB,gBAAA,CAAiB,OAAA;AAAA,cAmBP,eAAA,GAAmB,SAAA,EAAW,aAAa,CAAC,sBAAA,yCAAuB,OAAA;AAAA,cAMnE,kBAAA,YAA+B,OAAA,EAAS,eAAA,CAAgB,OAAA,MAAW,UAAA,CAAW,OAAA;AAAA,cAK9E,gBAAA,GAAoB,MAAc"}
@@ -0,0 +1,81 @@
1
+ import { makeTool } from "./registry.mjs";
2
+ import { Effect } from "effect";
3
+ import * as Schema from "effect/Schema";
4
+ import { ToolResult } from "@yolk-sdk/agent/protocol";
5
+ import { ToolError } from "@yolk-sdk/agent/loop";
6
+ //#region src/tools/task.ts
7
+ const taskToolName = "task";
8
+ const TaskToolParams = Schema.Struct({
9
+ description: Schema.String.pipe(Schema.annotate({ description: "A short 3-5 word description of the task." })),
10
+ prompt: Schema.String.pipe(Schema.annotate({ description: "The complete task instructions for the subagent, including all context it needs." })),
11
+ subagent_type: Schema.String.pipe(Schema.annotate({ description: "The specialized subagent type to use for this task." }))
12
+ });
13
+ const taskToolError = (message, cause) => new ToolError({
14
+ tool: taskToolName,
15
+ message,
16
+ cause
17
+ });
18
+ const trimmedTaskParams = (params) => ({
19
+ description: params.description.trim(),
20
+ prompt: params.prompt.trim(),
21
+ subagent_type: params.subagent_type.trim()
22
+ });
23
+ const validateTaskParams = (params) => {
24
+ const trimmed = trimmedTaskParams(params);
25
+ if (trimmed.description.length === 0) return Effect.fail(taskToolError("description must not be empty", "validation"));
26
+ if (trimmed.prompt.length === 0) return Effect.fail(taskToolError("prompt must not be empty", "validation"));
27
+ if (trimmed.subagent_type.length === 0) return Effect.fail(taskToolError("subagent_type must not be empty", "validation"));
28
+ return Effect.succeed(trimmed);
29
+ };
30
+ const findSubagent = (subagents, name) => subagents.find((subagent) => subagent.name === name);
31
+ const requireKnownSubagent = (subagents, name) => {
32
+ const subagent = findSubagent(subagents, name);
33
+ return subagent === void 0 ? Effect.fail(taskToolError(`Unknown subagent type: ${name}`, "validation")) : Effect.succeed(subagent);
34
+ };
35
+ const subagentDescription = (subagent) => `- ${subagent.name}: ${subagent.description}`;
36
+ const taskToolDescription = (subagents) => [
37
+ "Launch a new agent to handle complex, multistep tasks autonomously.",
38
+ "Use this when delegating focused work to a specialized subagent would save context or allow parallel exploration.",
39
+ "To run subagents in parallel, call this task tool multiple times in the same assistant response.",
40
+ "Yolk runs same-turn task calls concurrently automatically.",
41
+ "A fresh subagent only sees the prompt you provide, so include all required context.",
42
+ "Subagents can use their normal tools but cannot launch further task subagents in v1.",
43
+ subagents.length === 0 ? "No subagent types are currently available." : `Available subagent types:\n${subagents.map(subagentDescription).join("\n")}`
44
+ ].join("\n\n");
45
+ const makeTaskToolRegistration = (options) => makeTool({
46
+ name: taskToolName,
47
+ description: taskToolDescription(options.subagents),
48
+ parameters: TaskToolParams,
49
+ access: "read",
50
+ invalidParamsMessage: (error) => `Invalid task arguments: ${error instanceof Error ? error.message : String(error)}`,
51
+ execute: ({ call, context, params }) => Effect.gen(function* () {
52
+ if (call.name !== "task") return yield* Effect.fail(taskToolError(`Tool is not configured: ${call.name}`, "not_found"));
53
+ const normalizedParams = yield* validateTaskParams(params);
54
+ yield* requireKnownSubagent(options.subagents, normalizedParams.subagent_type);
55
+ return yield* options.execute({
56
+ call,
57
+ context,
58
+ params: normalizedParams
59
+ });
60
+ })
61
+ });
62
+ const makeTaskToolDef = (subagents) => makeTaskToolRegistration({
63
+ subagents,
64
+ execute: ({ call }) => Effect.succeed(ToolResult.make({
65
+ toolCallId: call.id,
66
+ content: ""
67
+ }))
68
+ }).def;
69
+ const makeTaskToolModule = (options) => ({
70
+ id: "task",
71
+ tools: [makeTaskToolRegistration(options)]
72
+ });
73
+ const formatTaskResult = (output) => [
74
+ "<task_result>",
75
+ output,
76
+ "</task_result>"
77
+ ].join("\n");
78
+ //#endregion
79
+ export { formatTaskResult, makeTaskToolDef, makeTaskToolModule, makeTaskToolRegistration, taskToolName };
80
+
81
+ //# sourceMappingURL=task.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task.mjs","names":[],"sources":["../../src/tools/task.ts"],"sourcesContent":["import { Effect } from 'effect'\nimport * as Schema from 'effect/Schema'\nimport { ToolError } from '@yolk-sdk/agent/loop'\nimport { ToolResult, type ToolCall } from '@yolk-sdk/agent/protocol'\nimport { makeTool, type ToolModule, type ToolRegistration } from './registry.ts'\n\nexport const taskToolName = 'task'\n\nconst TaskToolParams = Schema.Struct({\n description: Schema.String.pipe(Schema.annotate({ description: 'A short 3-5 word description of the task.' })),\n prompt: Schema.String.pipe(\n Schema.annotate({\n description: 'The complete task instructions for the subagent, including all context it needs.'\n })\n ),\n subagent_type: Schema.String.pipe(\n Schema.annotate({ description: 'The specialized subagent type to use for this task.' })\n )\n})\n\nexport type TaskToolParams = typeof TaskToolParams.Type\n\nexport type TaskSubagentDefinition = {\n readonly name: string\n readonly description: string\n}\n\nexport type TaskExecutionInput<Context> = {\n readonly call: ToolCall\n readonly context: Context\n readonly params: TaskToolParams\n}\n\nexport type TaskToolOptions<Context> = {\n readonly subagents: ReadonlyArray<TaskSubagentDefinition>\n readonly execute: (input: TaskExecutionInput<Context>) => Effect.Effect<ToolResult, ToolError>\n}\n\nconst taskToolError = (message: string, cause: ToolError['cause']) =>\n new ToolError({\n tool: taskToolName,\n message,\n cause\n })\n\nconst trimmedTaskParams = (params: TaskToolParams) => ({\n description: params.description.trim(),\n prompt: params.prompt.trim(),\n subagent_type: params.subagent_type.trim()\n})\n\nconst validateTaskParams = (params: TaskToolParams) => {\n const trimmed = trimmedTaskParams(params)\n\n if (trimmed.description.length === 0) {\n return Effect.fail(taskToolError('description must not be empty', 'validation'))\n }\n\n if (trimmed.prompt.length === 0) {\n return Effect.fail(taskToolError('prompt must not be empty', 'validation'))\n }\n\n if (trimmed.subagent_type.length === 0) {\n return Effect.fail(taskToolError('subagent_type must not be empty', 'validation'))\n }\n\n return Effect.succeed(trimmed)\n}\n\nconst findSubagent = (subagents: ReadonlyArray<TaskSubagentDefinition>, name: string) =>\n subagents.find(subagent => subagent.name === name)\n\nconst requireKnownSubagent = (\n subagents: ReadonlyArray<TaskSubagentDefinition>,\n name: string\n) => {\n const subagent = findSubagent(subagents, name)\n\n return subagent === undefined\n ? Effect.fail(taskToolError(`Unknown subagent type: ${name}`, 'validation'))\n : Effect.succeed(subagent)\n}\n\nconst subagentDescription = (subagent: TaskSubagentDefinition) =>\n `- ${subagent.name}: ${subagent.description}`\n\nconst taskToolDescription = (subagents: ReadonlyArray<TaskSubagentDefinition>) =>\n [\n 'Launch a new agent to handle complex, multistep tasks autonomously.',\n 'Use this when delegating focused work to a specialized subagent would save context or allow parallel exploration.',\n 'To run subagents in parallel, call this task tool multiple times in the same assistant response.',\n 'Yolk runs same-turn task calls concurrently automatically.',\n 'A fresh subagent only sees the prompt you provide, so include all required context.',\n 'Subagents can use their normal tools but cannot launch further task subagents in v1.',\n subagents.length === 0\n ? 'No subagent types are currently available.'\n : `Available subagent types:\\n${subagents.map(subagentDescription).join('\\n')}`\n ].join('\\n\\n')\n\nexport const makeTaskToolRegistration = <Context>(\n options: TaskToolOptions<Context>\n): ToolRegistration<Context> => makeTool({\n name: taskToolName,\n description: taskToolDescription(options.subagents),\n parameters: TaskToolParams,\n access: 'read',\n invalidParamsMessage: error => `Invalid task arguments: ${error instanceof Error ? error.message : String(error)}`,\n execute: ({ call, context, params }) =>\n Effect.gen(function* () {\n if (call.name !== taskToolName) {\n return yield* Effect.fail(taskToolError(`Tool is not configured: ${call.name}`, 'not_found'))\n }\n\n const normalizedParams = yield* validateTaskParams(params)\n yield* requireKnownSubagent(options.subagents, normalizedParams.subagent_type)\n\n return yield* options.execute({ call, context, params: normalizedParams })\n })\n})\n\nexport const makeTaskToolDef = (subagents: ReadonlyArray<TaskSubagentDefinition>) =>\n makeTaskToolRegistration({\n subagents,\n execute: ({ call }) => Effect.succeed(ToolResult.make({ toolCallId: call.id, content: '' }))\n }).def\n\nexport const makeTaskToolModule = <Context>(options: TaskToolOptions<Context>): ToolModule<Context> => ({\n id: 'task',\n tools: [makeTaskToolRegistration(options)]\n})\n\nexport const formatTaskResult = (output: string) => ['<task_result>', output, '</task_result>'].join('\\n')\n"],"mappings":";;;;;;AAMA,MAAa,eAAe;AAE5B,MAAM,iBAAiB,OAAO,OAAO;CACnC,aAAa,OAAO,OAAO,KAAK,OAAO,SAAS,EAAE,aAAa,4CAA4C,CAAC,CAAC;CAC7G,QAAQ,OAAO,OAAO,KACpB,OAAO,SAAS,EACd,aAAa,mFACf,CAAC,CACH;CACA,eAAe,OAAO,OAAO,KAC3B,OAAO,SAAS,EAAE,aAAa,sDAAsD,CAAC,CACxF;AACF,CAAC;AAoBD,MAAM,iBAAiB,SAAiB,UACtC,IAAI,UAAU;CACZ,MAAM;CACN;CACA;AACF,CAAC;AAEH,MAAM,qBAAqB,YAA4B;CACrD,aAAa,OAAO,YAAY,KAAK;CACrC,QAAQ,OAAO,OAAO,KAAK;CAC3B,eAAe,OAAO,cAAc,KAAK;AAC3C;AAEA,MAAM,sBAAsB,WAA2B;CACrD,MAAM,UAAU,kBAAkB,MAAM;CAExC,IAAI,QAAQ,YAAY,WAAW,GACjC,OAAO,OAAO,KAAK,cAAc,iCAAiC,YAAY,CAAC;CAGjF,IAAI,QAAQ,OAAO,WAAW,GAC5B,OAAO,OAAO,KAAK,cAAc,4BAA4B,YAAY,CAAC;CAG5E,IAAI,QAAQ,cAAc,WAAW,GACnC,OAAO,OAAO,KAAK,cAAc,mCAAmC,YAAY,CAAC;CAGnF,OAAO,OAAO,QAAQ,OAAO;AAC/B;AAEA,MAAM,gBAAgB,WAAkD,SACtE,UAAU,MAAK,aAAY,SAAS,SAAS,IAAI;AAEnD,MAAM,wBACJ,WACA,SACG;CACH,MAAM,WAAW,aAAa,WAAW,IAAI;CAE7C,OAAO,aAAa,KAAA,IAChB,OAAO,KAAK,cAAc,0BAA0B,QAAQ,YAAY,CAAC,IACzE,OAAO,QAAQ,QAAQ;AAC7B;AAEA,MAAM,uBAAuB,aAC3B,KAAK,SAAS,KAAK,IAAI,SAAS;AAElC,MAAM,uBAAuB,cAC3B;CACE;CACA;CACA;CACA;CACA;CACA;CACA,UAAU,WAAW,IACjB,+CACA,8BAA8B,UAAU,IAAI,mBAAmB,EAAE,KAAK,IAAI;AAChF,EAAE,KAAK,MAAM;AAEf,MAAa,4BACX,YAC8B,SAAS;CACvC,MAAM;CACN,aAAa,oBAAoB,QAAQ,SAAS;CAClD,YAAY;CACZ,QAAQ;CACR,uBAAsB,UAAS,2BAA2B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;CAC/G,UAAU,EAAE,MAAM,SAAS,aACzB,OAAO,IAAI,aAAa;EACtB,IAAI,KAAK,SAAA,QACP,OAAO,OAAO,OAAO,KAAK,cAAc,2BAA2B,KAAK,QAAQ,WAAW,CAAC;EAG9F,MAAM,mBAAmB,OAAO,mBAAmB,MAAM;EACzD,OAAO,qBAAqB,QAAQ,WAAW,iBAAiB,aAAa;EAE7E,OAAO,OAAO,QAAQ,QAAQ;GAAE;GAAM;GAAS,QAAQ;EAAiB,CAAC;CAC3E,CAAC;AACL,CAAC;AAED,MAAa,mBAAmB,cAC9B,yBAAyB;CACvB;CACA,UAAU,EAAE,WAAW,OAAO,QAAQ,WAAW,KAAK;EAAE,YAAY,KAAK;EAAI,SAAS;CAAG,CAAC,CAAC;AAC7F,CAAC,EAAE;AAEL,MAAa,sBAA+B,aAA4D;CACtG,IAAI;CACJ,OAAO,CAAC,yBAAyB,OAAO,CAAC;AAC3C;AAEA,MAAa,oBAAoB,WAAmB;CAAC;CAAiB;CAAQ;AAAgB,EAAE,KAAK,IAAI"}
package/package.json ADDED
@@ -0,0 +1,86 @@
1
+ {
2
+ "name": "@yolk-sdk/agent",
3
+ "version": "0.0.1-canary.0",
4
+ "description": "Protocol, loop, runtime, client, and tool primitives for building Yolk agents.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "sideEffects": false,
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/magoz/yolk-sdk.git",
11
+ "directory": "packages/agent"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/magoz/yolk-sdk/issues"
15
+ },
16
+ "homepage": "https://github.com/magoz/yolk-sdk#readme",
17
+ "keywords": [
18
+ "agent",
19
+ "agents",
20
+ "llm",
21
+ "tools",
22
+ "runtime",
23
+ "effect"
24
+ ],
25
+ "engines": {
26
+ "node": ">=22"
27
+ },
28
+ "exports": {
29
+ "./package.json": "./package.json",
30
+ ".": {
31
+ "types": "./dist/index.d.mts",
32
+ "import": "./dist/index.mjs",
33
+ "default": "./dist/index.mjs"
34
+ },
35
+ "./client": {
36
+ "types": "./dist/client/index.d.mts",
37
+ "import": "./dist/client/index.mjs",
38
+ "default": "./dist/client/index.mjs"
39
+ },
40
+ "./loop": {
41
+ "types": "./dist/loop/index.d.mts",
42
+ "import": "./dist/loop/index.mjs",
43
+ "default": "./dist/loop/index.mjs"
44
+ },
45
+ "./loop/testing": {
46
+ "types": "./dist/loop/testing/index.d.mts",
47
+ "import": "./dist/loop/testing/index.mjs",
48
+ "default": "./dist/loop/testing/index.mjs"
49
+ },
50
+ "./protocol": {
51
+ "types": "./dist/protocol/index.d.mts",
52
+ "import": "./dist/protocol/index.mjs",
53
+ "default": "./dist/protocol/index.mjs"
54
+ },
55
+ "./runtime": {
56
+ "types": "./dist/runtime/index.d.mts",
57
+ "import": "./dist/runtime/index.mjs",
58
+ "default": "./dist/runtime/index.mjs"
59
+ },
60
+ "./tools": {
61
+ "types": "./dist/tools/index.d.mts",
62
+ "import": "./dist/tools/index.mjs",
63
+ "default": "./dist/tools/index.mjs"
64
+ }
65
+ },
66
+ "files": [
67
+ "src/**/*.ts",
68
+ "!src/**/*.test.ts",
69
+ "!src/**/*.test.tsx",
70
+ "dist/**/*",
71
+ "README.md"
72
+ ],
73
+ "publishConfig": {
74
+ "access": "public",
75
+ "provenance": true
76
+ },
77
+ "dependencies": {
78
+ "effect": "4.0.0-beta.65"
79
+ },
80
+ "scripts": {
81
+ "build": "tsdown",
82
+ "check": "tsc -p tsconfig.json --noEmit",
83
+ "test": "vitest run --passWithNoTests",
84
+ "test:run": "vitest run --passWithNoTests"
85
+ }
86
+ }
@@ -0,0 +1,23 @@
1
+ # @yolk-sdk/agent/client
2
+
3
+ Framework-agnostic client transport and state helpers for Yolk agents.
4
+
5
+ ## What it provides
6
+
7
+ - Effect stream and async generator helpers for streamed `AgentEvent`s.
8
+ - Generic client state reducer helpers.
9
+ - Non-empty `AgentTranscript` type.
10
+ - Tool run lifecycle state.
11
+ - HITL response submission helpers for approvals and questions.
12
+ - Typed transport errors.
13
+
14
+ ## Use it when
15
+
16
+ - A browser, CLI, or other client needs to consume agent events from an app endpoint.
17
+ - You need protocol state without React hooks or UI components.
18
+
19
+ ## Boundaries
20
+
21
+ - No React.
22
+ - No UI components.
23
+ - No auth chrome, provider defaults, or app routes.
@@ -0,0 +1,43 @@
1
+ export {
2
+ appendAgentMessage,
3
+ applyAgentEvent,
4
+ completedToolRuns,
5
+ initialAgentClientState,
6
+ isActiveToolRun,
7
+ markAgentAborted,
8
+ markAgentError,
9
+ reduceAgentEvents,
10
+ submitAgentUserMessage
11
+ } from './state.ts'
12
+ export type {
13
+ AgentClientState,
14
+ AgentRunStatus,
15
+ AgentToolRun,
16
+ AgentTranscript,
17
+ ApplyAgentEventOptions
18
+ } from './state.ts'
19
+ export {
20
+ AgentTransportError,
21
+ cancelAgentRun,
22
+ collectAgentEvents,
23
+ collectAgentEventsEffect,
24
+ streamQuestionResponseEventStream,
25
+ streamCloudflareAgentEventStream,
26
+ streamCloudflareAgentEvents,
27
+ streamAgentEvents,
28
+ streamAgentEventStream,
29
+ streamAgentRunEvents,
30
+ streamAgentRunEventStream,
31
+ streamToolApprovalResponseEventStream,
32
+ submitQuestionResponse,
33
+ submitToolApprovalResponse
34
+ } from './transport.ts'
35
+ export type {
36
+ AgentHttpResponseInfo,
37
+ CancelAgentRunRequest,
38
+ SubmitQuestionResponseRequest,
39
+ SubmitToolApprovalResponseRequest,
40
+ StreamAgentEventsRequest,
41
+ StreamAgentRunEventsRequest,
42
+ StreamCloudflareAgentEventsRequest
43
+ } from './transport.ts'