clanka 0.0.28 → 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 (73) hide show
  1. package/dist/Agent.d.ts +87 -40
  2. package/dist/Agent.d.ts.map +1 -1
  3. package/dist/Agent.js +154 -94
  4. package/dist/Agent.js.map +1 -1
  5. package/dist/AgentExecutor.d.ts +165 -0
  6. package/dist/AgentExecutor.d.ts.map +1 -0
  7. package/dist/AgentExecutor.js +121 -0
  8. package/dist/AgentExecutor.js.map +1 -0
  9. package/dist/AgentTools.d.ts +14 -132
  10. package/dist/AgentTools.d.ts.map +1 -1
  11. package/dist/AgentTools.js +10 -12
  12. package/dist/AgentTools.js.map +1 -1
  13. package/dist/OutputFormatter.d.ts.map +1 -1
  14. package/dist/OutputFormatter.js +18 -0
  15. package/dist/OutputFormatter.js.map +1 -1
  16. package/dist/WebToMarkdown.d.ts.map +1 -1
  17. package/dist/WebToMarkdown.js +1 -1
  18. package/dist/WebToMarkdown.js.map +1 -1
  19. package/dist/WebToMarkdown.test.d.ts +2 -0
  20. package/dist/WebToMarkdown.test.d.ts.map +1 -0
  21. package/dist/WebToMarkdown.test.js +37 -0
  22. package/dist/WebToMarkdown.test.js.map +1 -0
  23. package/dist/index.d.ts +4 -4
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +4 -4
  26. package/dist/index.js.map +1 -1
  27. package/package.json +3 -3
  28. package/src/Agent.ts +290 -215
  29. package/src/AgentExecutor.ts +245 -0
  30. package/src/AgentTools.ts +25 -22
  31. package/src/OutputFormatter.ts +18 -0
  32. package/src/WebToMarkdown.test.ts +65 -0
  33. package/src/WebToMarkdown.ts +1 -0
  34. package/src/index.ts +4 -4
  35. package/dist/Agent.test.d.ts +0 -2
  36. package/dist/Agent.test.d.ts.map +0 -1
  37. package/dist/Agent.test.js +0 -111
  38. package/dist/Agent.test.js.map +0 -1
  39. package/dist/AgentTools.test.d.ts +0 -2
  40. package/dist/AgentTools.test.d.ts.map +0 -1
  41. package/dist/AgentTools.test.js +0 -714
  42. package/dist/AgentTools.test.js.map +0 -1
  43. package/dist/DuckDuckGo.d.ts +0 -28
  44. package/dist/DuckDuckGo.d.ts.map +0 -1
  45. package/dist/DuckDuckGo.js +0 -131
  46. package/dist/DuckDuckGo.js.map +0 -1
  47. package/dist/Executor.d.ts +0 -20
  48. package/dist/Executor.d.ts.map +0 -1
  49. package/dist/Executor.js +0 -98
  50. package/dist/Executor.js.map +0 -1
  51. package/dist/GithubCopilot.d.ts +0 -11
  52. package/dist/GithubCopilot.d.ts.map +0 -1
  53. package/dist/GithubCopilot.js +0 -14
  54. package/dist/GithubCopilot.js.map +0 -1
  55. package/dist/GithubCopilotAuth.d.ts +0 -57
  56. package/dist/GithubCopilotAuth.d.ts.map +0 -1
  57. package/dist/GithubCopilotAuth.js +0 -218
  58. package/dist/GithubCopilotAuth.js.map +0 -1
  59. package/dist/GithubCopilotAuth.test.d.ts +0 -2
  60. package/dist/GithubCopilotAuth.test.d.ts.map +0 -1
  61. package/dist/GithubCopilotAuth.test.js +0 -267
  62. package/dist/GithubCopilotAuth.test.js.map +0 -1
  63. package/dist/MockSearch.d.ts +0 -12
  64. package/dist/MockSearch.d.ts.map +0 -1
  65. package/dist/MockSearch.js +0 -4
  66. package/dist/MockSearch.js.map +0 -1
  67. package/dist/ai.d.ts +0 -2
  68. package/dist/ai.d.ts.map +0 -1
  69. package/dist/ai.js +0 -29
  70. package/dist/ai.js.map +0 -1
  71. package/dist/examples/cli.mjs +0 -68514
  72. package/src/Agent.test.ts +0 -159
  73. package/src/Executor.ts +0 -151
package/dist/Agent.d.ts CHANGED
@@ -1,20 +1,48 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import { Effect, FileSystem, Layer, Path, Schema, Scope, ServiceMap, Stream } from "effect";
4
+ import { Effect, Layer, Schema, Scope, ServiceMap, Stream } from "effect";
5
5
  import { AiError, LanguageModel, Prompt, Tool, Toolkit } from "effect/unstable/ai";
6
- import { AgentTools } from "./AgentTools.ts";
7
- import { Executor } from "./Executor.ts";
8
- import { ToolkitRenderer } from "./ToolkitRenderer.ts";
9
6
  import { ModelName, ProviderName } from "effect/unstable/ai/Model";
10
- import type { ChildProcessSpawner } from "effect/unstable/process";
11
- import type { HttpClient } from "effect/unstable/http";
7
+ import * as AgentExecutor from "./AgentExecutor.ts";
8
+ import type { Path } from "effect/Path";
9
+ import type { ChildProcessSpawner } from "effect/unstable/process/ChildProcessSpawner";
10
+ import type { HttpClient } from "effect/unstable/http/HttpClient";
11
+ import type { CurrentDirectory, SubagentExecutor, TaskCompleter } from "./AgentTools.ts";
12
+ import type { FileSystem } from "effect/FileSystem";
13
+ /**
14
+ * @since 1.0.0
15
+ * @category Models
16
+ */
17
+ export type TypeId = "~clanka/Agent";
18
+ /**
19
+ * @since 1.0.0
20
+ * @category Models
21
+ */
22
+ export declare const TypeId: TypeId;
12
23
  /**
13
24
  * @since 1.0.0
14
25
  * @category Models
15
26
  */
16
27
  export interface Agent {
17
- readonly output: Stream.Stream<Output, AgentFinished | AiError.AiError>;
28
+ readonly [TypeId]: TypeId;
29
+ /**
30
+ * Send a prompt to the agent and receive a stream of output.
31
+ */
32
+ send(options: {
33
+ /**
34
+ * The prompt to send to the agent.
35
+ */
36
+ readonly prompt: Prompt.RawInput;
37
+ /**
38
+ * Provide additional system instructions, or a function that generates
39
+ * system instructions based on the tool instructions
40
+ */
41
+ readonly system?: string | ((options: {
42
+ readonly toolInstructions: string;
43
+ readonly agentsMd: string;
44
+ }) => string) | undefined;
45
+ }): Effect.Effect<Stream.Stream<Output, AgentFinished | AiError.AiError>, never, Scope.Scope | LanguageModel.LanguageModel | ProviderName | ModelName>;
18
46
  /**
19
47
  * Send a message to the agent to steer its behavior. This is useful for
20
48
  * providing feedback or new instructions while the agent is running.
@@ -26,29 +54,42 @@ export interface Agent {
26
54
  steer(message: string): Effect.Effect<void>;
27
55
  }
28
56
  /**
29
- * Start an agent in the given directory with the given prompt and tools.
30
- *
57
+ * @since 1.0.0
58
+ * @category Service
59
+ */
60
+ export declare const Agent: ServiceMap.Service<Agent, Agent>;
61
+ /**
31
62
  * @since 1.0.0
32
63
  * @category Constructors
33
64
  */
34
- export declare const make: <Toolkit extends Toolkit.Any = never, SE = never, SR = never>(options: {
35
- /** The working directory to run the agent in */
65
+ export declare const make: Effect.Effect<Agent, never, Scope.Scope | AgentExecutor.AgentExecutor>;
66
+ /**
67
+ * @since 1.0.0
68
+ * @category Layers
69
+ */
70
+ export declare const layer: Layer.Layer<Agent, never, AgentExecutor.AgentExecutor>;
71
+ /**
72
+ * Create an Agent layer that uses a local AgentExecutor.
73
+ *
74
+ * @since 1.0.0
75
+ * @category Layers
76
+ */
77
+ export declare const layerLocal: <Toolkit extends Toolkit.Any = never>(options: {
36
78
  readonly directory: string;
37
- /** The prompt to use for the agent */
38
- readonly prompt: Prompt.RawInput;
39
- /**
40
- * Provide additional system instructions, or a function that generates
41
- * system instructions based on the tool instructions
42
- */
43
- readonly system?: string | ((options: {
44
- readonly toolInstructions: string;
45
- readonly agentsMd: string;
46
- }) => string) | undefined;
47
- /** Additional tools to provide to the agent */
48
79
  readonly tools?: Toolkit | undefined;
49
- /** Layer to use for subagents */
50
- readonly subagentModel?: Layer.Layer<LanguageModel.LanguageModel | ProviderName | ModelName, SE, SR> | undefined;
51
- }) => Effect.Effect<Agent, never, Scope.Scope | FileSystem.FileSystem | Path.Path | Executor | LanguageModel.LanguageModel | ProviderName | ModelName | ToolkitRenderer | (Toolkit extends Toolkit.Toolkit<infer T> ? Tool.HandlersFor<T> | Tool.HandlerServices<T[keyof T]> : never) | Tool.HandlersFor<typeof AgentTools.tools> | SR>;
80
+ }) => Layer.Layer<Agent, never, FileSystem | Path | ChildProcessSpawner | HttpClient | Exclude<Toolkit extends Toolkit.Toolkit<infer T> ? Tool.HandlersFor<T> | Tool.HandlerServices<T[keyof T]> : never, CurrentDirectory | SubagentExecutor | TaskCompleter>>;
81
+ declare const SubagentModel_base: ServiceMap.ServiceClass<SubagentModel, "clanka/Agent/SubagentModel", ServiceMap.ServiceMap<LanguageModel.LanguageModel | ProviderName | ModelName>>;
82
+ /**
83
+ * @since 1.0.0
84
+ * @category Subagent model
85
+ */
86
+ export declare class SubagentModel extends SubagentModel_base {
87
+ }
88
+ /**
89
+ * @since 1.0.0
90
+ * @category Subagent model
91
+ */
92
+ export declare const layerSubagentModel: <E, R>(layer: Layer.Layer<LanguageModel.LanguageModel | ProviderName | ModelName, E, R>) => Layer.Layer<SubagentModel, E, R>;
52
93
  declare const AgentModelConfig_base: ServiceMap.Reference<{
53
94
  readonly systemPromptTransform?: <A, E, R>(system: string, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
54
95
  readonly supportsAssistantPrefill?: boolean | undefined;
@@ -61,13 +102,19 @@ declare const AgentModelConfig_base: ServiceMap.Reference<{
61
102
  export declare class AgentModelConfig extends AgentModelConfig_base {
62
103
  static readonly layer: (options: typeof AgentModelConfig.Service) => Layer.Layer<never, never, never>;
63
104
  }
105
+ declare const AgentStart_base: Schema.ExtendableClass<AgentStart, Schema.TaggedStruct<"AgentStart", {
106
+ readonly id: Schema.Number;
107
+ readonly prompt: Schema.Codec<Prompt.Prompt, Prompt.PromptEncoded, never, never>;
108
+ readonly provider: Schema.String;
109
+ readonly model: Schema.String;
110
+ }>, {}>;
64
111
  /**
65
- * A layer that provides most of the common services needed to run an agent.
66
- *
67
112
  * @since 1.0.0
68
- * @category Services
113
+ * @category Output
69
114
  */
70
- export declare const layerServices: Layer.Layer<Tool.HandlersFor<typeof AgentTools.tools> | Executor | ToolkitRenderer, never, FileSystem.FileSystem | Path.Path | ChildProcessSpawner.ChildProcessSpawner | HttpClient.HttpClient>;
115
+ export declare class AgentStart extends AgentStart_base {
116
+ get modelAndProvider(): string;
117
+ }
71
118
  declare const ReasoningStart_base: Schema.ExtendableClass<ReasoningStart, Schema.TaggedStruct<"ReasoningStart", {}>, {}>;
72
119
  /**
73
120
  * @since 1.0.0
@@ -123,15 +170,6 @@ declare const ScriptOutput_base: Schema.ExtendableClass<ScriptOutput, Schema.Tag
123
170
  */
124
171
  export declare class ScriptOutput extends ScriptOutput_base {
125
172
  }
126
- declare const AgentFinished_base: Schema.ErrorClass<AgentFinished, Schema.TaggedStruct<"AgentFinished", {
127
- readonly summary: Schema.String;
128
- }>, import("effect/Cause").YieldableError>;
129
- /**
130
- * @since 1.0.0
131
- * @category Output
132
- */
133
- export declare class AgentFinished extends AgentFinished_base {
134
- }
135
173
  declare const SubagentStart_base: Schema.ExtendableClass<SubagentStart, Schema.TaggedStruct<"SubagentStart", {
136
174
  readonly id: Schema.Number;
137
175
  readonly prompt: Schema.String;
@@ -171,11 +209,20 @@ export declare class SubagentPart extends SubagentPart_base {
171
209
  * @since 1.0.0
172
210
  * @category Output
173
211
  */
174
- export type Output = ContentPart | SubagentStart | SubagentComplete | SubagentPart;
212
+ export type Output = AgentStart | ContentPart | SubagentStart | SubagentComplete | SubagentPart;
213
+ /**
214
+ * @since 1.0.0
215
+ * @category Output
216
+ */
217
+ export declare const Output: Schema.Union<readonly [typeof AgentStart, typeof ReasoningStart, typeof ReasoningDelta, typeof ReasoningEnd, typeof ScriptStart, typeof ScriptDelta, typeof ScriptEnd, typeof ScriptOutput, typeof SubagentStart, typeof SubagentComplete, typeof SubagentPart]>;
218
+ declare const AgentFinished_base: Schema.ErrorClass<AgentFinished, Schema.TaggedStruct<"AgentFinished", {
219
+ readonly summary: Schema.String;
220
+ }>, import("effect/Cause").YieldableError>;
175
221
  /**
176
222
  * @since 1.0.0
177
223
  * @category Output
178
224
  */
179
- export declare const Output: Schema.Union<readonly [typeof ReasoningStart, typeof ReasoningDelta, typeof ReasoningEnd, typeof ScriptStart, typeof ScriptDelta, typeof ScriptEnd, typeof ScriptOutput, typeof SubagentStart, typeof SubagentComplete, typeof SubagentPart]>;
225
+ export declare class AgentFinished extends AgentFinished_base {
226
+ }
180
227
  export {};
181
228
  //# sourceMappingURL=Agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../src/Agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Agent.d.ts","sourceRoot":"","sources":["../src/Agent.ts"],"names":[],"mappings":"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"}
package/dist/Agent.js CHANGED
@@ -1,32 +1,31 @@
1
1
  /**
2
2
  * @since 1.0.0
3
3
  */
4
- import { Array, Deferred, Effect, FileSystem, identity, Layer, Option, Path, pipe, Queue, Schema, Scope, ServiceMap, Stream, } from "effect";
4
+ import { Array, Effect, identity, Layer, MutableRef, Option, pipe, Queue, Schema, Scope, Semaphore, ServiceMap, Stream, } from "effect";
5
5
  import { AiError, LanguageModel, Prompt, Tool, Toolkit, } from "effect/unstable/ai";
6
- import { AgentToolHandlers, AgentTools, CurrentDirectory, SubagentContext, TaskCompleteDeferred, } from "./AgentTools.js";
7
- import { Executor } from "./Executor.js";
8
- import { ToolkitRenderer } from "./ToolkitRenderer.js";
9
6
  import { ModelName, ProviderName } from "effect/unstable/ai/Model";
10
7
  import {} from "effect/unstable/ai/Response";
8
+ import * as AgentExecutor from "./AgentExecutor.js";
9
+ /**
10
+ * @since 1.0.0
11
+ * @category Models
12
+ */
13
+ export const TypeId = "~clanka/Agent";
14
+ /**
15
+ * @since 1.0.0
16
+ * @category Service
17
+ */
18
+ export const Agent = ServiceMap.Service("clanka/Agent");
11
19
  /**
12
- * Start an agent in the given directory with the given prompt and tools.
13
- *
14
20
  * @since 1.0.0
15
21
  * @category Constructors
16
22
  */
17
- export const make = Effect.fnUntraced(function* (options) {
18
- const fs = yield* FileSystem.FileSystem;
19
- const pathService = yield* Path.Path;
20
- const executor = yield* Executor;
21
- const renderer = yield* ToolkitRenderer;
22
- const generateSystem = typeof options.system === "function" ? options.system : defaultSystem;
23
- const allTools = Toolkit.merge(AgentTools, options.tools ?? Toolkit.empty);
24
- const allToolsDts = renderer.render(allTools);
25
- const tools = yield* allTools;
23
+ export const make = Effect.gen(function* () {
24
+ const executor = yield* AgentExecutor.AgentExecutor;
26
25
  const singleTool = yield* SingleTools.asEffect().pipe(Effect.provide(SingleToolHandlers));
27
- const services = yield* Effect.services();
26
+ const toolsDts = yield* executor.toolsDts;
28
27
  const pendingMessages = new Set();
29
- const agentsMd = yield* pipe(fs.readFileString(pathService.resolve(options.directory, "AGENTS.md")), Effect.map((content) => `# AGENTS.md
28
+ const agentsMd = yield* pipe(executor.agentsMd, Effect.map(Option.map((content) => `# AGENTS.md
30
29
 
31
30
  The following instructions are from ./AGENTS.md in the current directory.
32
31
  You do not need to read this file again.
@@ -35,29 +34,36 @@ You do not need to read this file again.
35
34
 
36
35
  <!-- AGENTS.md start -->
37
36
  ${content}
38
- <!-- AGENTS.md end -->`), Effect.option);
37
+ <!-- AGENTS.md end -->`)));
39
38
  let agentCounter = 0;
40
39
  const outputBuffer = new Map();
41
40
  let currentOutputAgent = null;
42
- const spawn = Effect.fnUntraced(function* (agentId, prompt) {
41
+ let history = MutableRef.make(Prompt.empty);
42
+ const spawn = Effect.fnUntraced(function* (opts) {
43
+ const agentId = opts.agentId;
43
44
  const ai = yield* LanguageModel.LanguageModel;
45
+ const subagentModel = yield* Effect.serviceOption(SubagentModel);
44
46
  const modelConfig = yield* AgentModelConfig;
47
+ const services = yield* Effect.services();
48
+ let finalSummary = Option.none();
45
49
  const singleToolMode = modelConfig.supportsNoTools !== true;
46
- const deferred = yield* Deferred.make();
47
50
  const output = yield* Queue.make();
48
- const toolInstructions = generateSystemTools(allToolsDts, !singleToolMode);
51
+ const prompt = opts.disableHistory ? MutableRef.make(Prompt.empty) : history;
52
+ MutableRef.update(prompt, Prompt.concat(opts.prompt));
53
+ const generateSystem = typeof opts.system === "function" ? opts.system : defaultSystem;
54
+ const toolInstructions = generateSystemTools(toolsDts, !singleToolMode);
49
55
  let system = generateSystem({
50
56
  toolInstructions,
51
57
  agentsMd: Option.getOrElse(agentsMd, () => ""),
52
58
  });
53
- if (typeof options.system === "string") {
54
- system += `\n${options.system}\n`;
59
+ if (typeof opts.system === "string") {
60
+ system += `\n${opts.system}\n`;
55
61
  }
56
62
  function maybeSend(options) {
57
- if (currentOutputAgent === null || currentOutputAgent === agentId) {
63
+ if (currentOutputAgent === null || currentOutputAgent === opts.agentId) {
58
64
  Queue.offerUnsafe(output, options.part);
59
65
  if (options.acquire) {
60
- currentOutputAgent = agentId;
66
+ currentOutputAgent = opts.agentId;
61
67
  }
62
68
  if (options.release) {
63
69
  currentOutputAgent = null;
@@ -74,92 +80,105 @@ ${content}
74
80
  }
75
81
  return;
76
82
  }
77
- let state = outputBuffer.get(agentId);
83
+ let state = outputBuffer.get(opts.agentId);
78
84
  if (!state) {
79
85
  state = [];
80
- outputBuffer.set(agentId, state);
86
+ outputBuffer.set(opts.agentId, state);
81
87
  }
82
88
  state.push(options.part);
83
89
  return;
84
90
  }
85
- const taskServices = SubagentContext.serviceMap({
86
- spawn: ({ prompt }) => {
87
- let id = agentCounter++;
88
- const stream = spawn(id, Prompt.make(`You have been asked using the "delegate" function to complete the following task. Avoid using the "delegate" function yourself unless strictly necessary:
91
+ const spawnSubagent = Effect.fnUntraced(function* (prompt) {
92
+ let id = agentCounter++;
93
+ const stream = spawn({
94
+ agentId: id,
95
+ prompt: Prompt.make(`You have been asked using the "delegate" function to complete the following task. Try to avoid using the "delegate" function yourself unless strictly necessary:
89
96
 
90
- ${prompt}`));
91
- return Effect.gen(function* () {
92
- const provider = yield* ProviderName;
93
- const model = yield* ModelName;
94
- maybeSend({
95
- agentId,
96
- part: new SubagentStart({ id, prompt, model, provider }),
97
- release: true,
98
- });
99
- return yield* stream.pipe(Stream.runForEachArray((parts) => {
100
- for (const part of parts) {
101
- switch (part._tag) {
102
- case "SubagentStart":
103
- case "SubagentComplete":
104
- case "SubagentPart":
105
- Queue.offerUnsafe(output, part);
106
- break;
107
- default:
108
- Queue.offerUnsafe(output, new SubagentPart({ id, part }));
109
- break;
110
- }
111
- }
112
- return Effect.void;
113
- }), Effect.as(""), Effect.catchTag("AgentFinished", (finished) => {
114
- Queue.offerUnsafe(output, new SubagentComplete({ id, summary: finished.summary }));
115
- return Effect.succeed(finished.summary);
116
- }), Effect.orDie);
117
- }).pipe(options.subagentModel
118
- ? Effect.provide(Layer.orDie(options.subagentModel))
119
- : Effect.provideServices(services));
120
- },
121
- }).pipe(ServiceMap.add(CurrentDirectory, options.directory), ServiceMap.add(TaskCompleteDeferred, deferred));
97
+ ${prompt}`),
98
+ system: opts.system,
99
+ disableHistory: true,
100
+ });
101
+ const provider = yield* ProviderName;
102
+ const model = yield* ModelName;
103
+ maybeSend({
104
+ agentId: opts.agentId,
105
+ part: new SubagentStart({ id, prompt, model, provider }),
106
+ release: true,
107
+ });
108
+ return yield* stream.pipe(Stream.runForEachArray((parts) => {
109
+ for (const part of parts) {
110
+ switch (part._tag) {
111
+ case "AgentStart":
112
+ break;
113
+ case "SubagentStart":
114
+ case "SubagentComplete":
115
+ case "SubagentPart":
116
+ Queue.offerUnsafe(output, part);
117
+ break;
118
+ default:
119
+ Queue.offerUnsafe(output, new SubagentPart({ id, part }));
120
+ break;
121
+ }
122
+ }
123
+ return Effect.void;
124
+ }), Effect.as(""), Effect.catchTag("AgentFinished", (finished) => {
125
+ Queue.offerUnsafe(output, new SubagentComplete({ id, summary: finished.summary }));
126
+ return Effect.succeed(finished.summary);
127
+ }), Effect.orDie);
128
+ }, Option.isSome(subagentModel)
129
+ ? Effect.provideServices(subagentModel.value)
130
+ : Effect.provideServices(services));
122
131
  const executeScript = Effect.fnUntraced(function* (script) {
123
132
  maybeSend({ agentId, part: new ScriptEnd(), release: true });
124
- const output = yield* pipe(executor.execute({ tools, script }), Stream.mkString, Effect.provideServices(taskServices));
133
+ const output = yield* pipe(executor.execute({
134
+ script,
135
+ onSubagent: spawnSubagent,
136
+ onTaskComplete: (summary) => Effect.sync(() => {
137
+ finalSummary = Option.some(summary);
138
+ }),
139
+ }), Stream.mkString);
125
140
  maybeSend({ agentId, part: new ScriptOutput({ output }) });
126
141
  return output;
127
142
  });
128
143
  if (!modelConfig.systemPromptTransform) {
129
- prompt = Prompt.setSystem(prompt, system);
144
+ MutableRef.update(prompt, Prompt.setSystem(system));
130
145
  }
131
146
  let currentScript = "";
132
147
  yield* Effect.gen(function* () {
133
148
  while (true) {
134
149
  if (!singleToolMode && currentScript.length > 0) {
135
150
  const result = yield* executeScript(currentScript);
136
- prompt = Prompt.concat(prompt, [
151
+ MutableRef.update(prompt, Prompt.concat([
137
152
  {
138
- role: modelConfig.supportsAssistantPrefill ? "assistant" : "user",
153
+ role: modelConfig.supportsAssistantPrefill
154
+ ? "assistant"
155
+ : "user",
139
156
  content: `Javascript output:\n\n${result}`,
140
157
  },
141
- ]);
158
+ ]));
142
159
  currentScript = "";
143
160
  }
144
- if (Deferred.isDoneUnsafe(deferred)) {
145
- yield* Queue.fail(output, new AgentFinished({ summary: yield* Deferred.await(deferred) }));
161
+ if (Option.isSome(finalSummary)) {
162
+ yield* Queue.fail(output, new AgentFinished({ summary: finalSummary.value }));
146
163
  return;
147
164
  }
148
165
  if (pendingMessages.size > 0) {
149
- prompt = Prompt.concat(prompt, Array.Array.from(pendingMessages, ({ message, resume }) => {
166
+ MutableRef.update(prompt, Prompt.concat(Array.Array.from(pendingMessages, ({ message, resume }) => {
150
167
  resume(Effect.void);
151
168
  return {
152
169
  role: "user",
153
170
  content: message,
154
171
  };
155
- }));
172
+ })));
156
173
  pendingMessages.clear();
157
174
  }
158
175
  // oxlint-disable-next-line typescript/no-explicit-any
159
176
  let response = Array.empty();
160
177
  let reasoningStarted = false;
161
178
  let hadReasoningDelta = false;
162
- yield* pipe(ai.streamText(singleToolMode ? { prompt, toolkit: singleTool } : { prompt }), Stream.takeUntil((part) => {
179
+ yield* pipe(ai.streamText(singleToolMode
180
+ ? { prompt: prompt.current, toolkit: singleTool }
181
+ : { prompt: prompt.current }), Stream.takeUntil((part) => {
163
182
  if (!singleToolMode &&
164
183
  part.type === "text-end" &&
165
184
  currentScript.trim().length > 0) {
@@ -269,28 +288,36 @@ ${prompt}`));
269
288
  }), modelConfig.systemPromptTransform
270
289
  ? (effect) => modelConfig.systemPromptTransform(system, effect)
271
290
  : identity);
272
- prompt = Prompt.concat(prompt, Prompt.fromResponseParts(response));
291
+ MutableRef.update(prompt, Prompt.concat(Prompt.fromResponseParts(response)));
273
292
  currentScript = currentScript.trim();
274
293
  }
275
- }).pipe(Effect.provideServices(taskServices.pipe(ServiceMap.add(ScriptExecutor, (script) => {
294
+ }).pipe(Effect.provideService(ScriptExecutor, (script) => {
276
295
  maybeSend({ agentId, part: new ScriptStart() });
277
296
  maybeSend({ agentId, part: new ScriptDelta({ delta: script }) });
278
297
  return executeScript(script);
279
- }))), Effect.provideServices(services), Effect.catchCause((cause) => Queue.failCause(output, cause)), Effect.forkScoped);
298
+ }), Effect.catchCause((cause) => Queue.failCause(output, cause)), Effect.forkScoped);
299
+ yield* Queue.offer(output, new AgentStart({
300
+ id: opts.agentId,
301
+ prompt: opts.prompt,
302
+ provider: yield* ProviderName,
303
+ model: yield* ModelName,
304
+ }));
280
305
  return Stream.fromQueue(output);
281
306
  }, Stream.unwrap);
282
- const output = yield* spawn(agentCounter++, Prompt.make(options.prompt)).pipe(Stream.broadcast({
283
- capacity: "unbounded",
284
- }));
285
- return identity({
286
- output,
307
+ const sendLock = Semaphore.makeUnsafe(1);
308
+ return Agent.of({
309
+ [TypeId]: TypeId,
310
+ send: (options) => spawn({
311
+ agentId: agentCounter++,
312
+ prompt: Prompt.make(options.prompt),
313
+ system: options.system,
314
+ }).pipe(Stream.broadcast({ capacity: "unbounded" }), sendLock.withPermit),
287
315
  steer: (message) => Effect.callback((resume) => {
288
316
  const entry = { message, resume };
289
317
  pendingMessages.add(entry);
290
318
  return Effect.sync(() => pendingMessages.delete(entry));
291
319
  }),
292
320
  });
293
- // oxlint-disable-next-line typescript/no-explicit-any
294
321
  });
295
322
  const defaultSystem = (options) => `You are a world-class software engineer: precise, rigorous, thoughtful, and relentlessly careful. You fully understand the task, verify assumptions, and produce minimal, correct, maintainable solutions. You make no mistakes.
296
323
 
@@ -347,6 +374,7 @@ You have the following functions available to you:
347
374
  \`\`\`ts
348
375
  ${toolsDts}
349
376
 
377
+ /** The global Fetch API available for making HTTP requests. */
350
378
  declare const fetch: typeof globalThis.fetch
351
379
  \`\`\``;
352
380
  };
@@ -363,6 +391,7 @@ You have the following functions available to you:
363
391
  \`\`\`ts
364
392
  ${toolsDts}
365
393
 
394
+ // The global Fetch API available for making HTTP requests.
366
395
  declare const fetch: typeof globalThis.fetch
367
396
  \`\`\``;
368
397
  };
@@ -382,6 +411,29 @@ const SingleToolHandlers = SingleTools.toLayer({
382
411
  return yield* execute(script);
383
412
  }),
384
413
  });
414
+ /**
415
+ * @since 1.0.0
416
+ * @category Layers
417
+ */
418
+ export const layer = Layer.effect(Agent, make);
419
+ /**
420
+ * Create an Agent layer that uses a local AgentExecutor.
421
+ *
422
+ * @since 1.0.0
423
+ * @category Layers
424
+ */
425
+ export const layerLocal = (options) => layer.pipe(Layer.provide(AgentExecutor.layerLocal(options)));
426
+ /**
427
+ * @since 1.0.0
428
+ * @category Subagent model
429
+ */
430
+ export class SubagentModel extends ServiceMap.Service()("clanka/Agent/SubagentModel") {
431
+ }
432
+ /**
433
+ * @since 1.0.0
434
+ * @category Subagent model
435
+ */
436
+ export const layerSubagentModel = (layer) => Layer.effect(SubagentModel, Layer.build(layer));
385
437
  /**
386
438
  * @since 1.0.0
387
439
  * @category System prompts
@@ -392,12 +444,19 @@ export class AgentModelConfig extends ServiceMap.Reference("clanka/Agent/SystemP
392
444
  static layer = (options) => Layer.succeed(AgentModelConfig, options);
393
445
  }
394
446
  /**
395
- * A layer that provides most of the common services needed to run an agent.
396
- *
397
447
  * @since 1.0.0
398
- * @category Services
448
+ * @category Output
399
449
  */
400
- export const layerServices = Layer.mergeAll(AgentToolHandlers, Executor.layer, ToolkitRenderer.layer);
450
+ export class AgentStart extends Schema.TaggedClass()("AgentStart", {
451
+ id: Schema.Number,
452
+ prompt: Prompt.Prompt,
453
+ provider: Schema.String,
454
+ model: Schema.String,
455
+ }) {
456
+ get modelAndProvider() {
457
+ return `${this.provider}/${this.model}`;
458
+ }
459
+ }
401
460
  /**
402
461
  * @since 1.0.0
403
462
  * @category Output
@@ -446,14 +505,6 @@ export class ScriptOutput extends Schema.TaggedClass()("ScriptOutput", {
446
505
  output: Schema.String,
447
506
  }) {
448
507
  }
449
- /**
450
- * @since 1.0.0
451
- * @category Output
452
- */
453
- export class AgentFinished extends Schema.TaggedErrorClass()("AgentFinished", {
454
- summary: Schema.String,
455
- }) {
456
- }
457
508
  /**
458
509
  * @since 1.0.0
459
510
  * @category Output
@@ -500,6 +551,7 @@ export class SubagentPart extends Schema.TaggedClass()("SubagentPart", {
500
551
  * @category Output
501
552
  */
502
553
  export const Output = Schema.Union([
554
+ AgentStart,
503
555
  ReasoningStart,
504
556
  ReasoningDelta,
505
557
  ReasoningEnd,
@@ -511,4 +563,12 @@ export const Output = Schema.Union([
511
563
  SubagentComplete,
512
564
  SubagentPart,
513
565
  ]);
566
+ /**
567
+ * @since 1.0.0
568
+ * @category Output
569
+ */
570
+ export class AgentFinished extends Schema.TaggedErrorClass()("AgentFinished", {
571
+ summary: Schema.String,
572
+ }) {
573
+ }
514
574
  //# sourceMappingURL=Agent.js.map