@better-agent/core 0.1.0-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.
- package/README.md +3 -0
- package/dist/agent/constants.mjs +6 -0
- package/dist/agent/constants.mjs.map +1 -0
- package/dist/agent/define-agent.d.mts +29 -0
- package/dist/agent/define-agent.d.mts.map +1 -0
- package/dist/agent/define-agent.mjs +27 -0
- package/dist/agent/define-agent.mjs.map +1 -0
- package/dist/agent/index.d.mts +2 -0
- package/dist/agent/types.d.mts +216 -0
- package/dist/agent/types.d.mts.map +1 -0
- package/dist/agent/validation.mjs +64 -0
- package/dist/agent/validation.mjs.map +1 -0
- package/dist/api.d.mts +8 -0
- package/dist/api.d.mts.map +1 -0
- package/dist/api.mjs +63 -0
- package/dist/api.mjs.map +1 -0
- package/dist/app/config.mjs +43 -0
- package/dist/app/config.mjs.map +1 -0
- package/dist/app/create-app.d.mts +36 -0
- package/dist/app/create-app.d.mts.map +1 -0
- package/dist/app/create-app.mjs +132 -0
- package/dist/app/create-app.mjs.map +1 -0
- package/dist/app/registry.mjs +43 -0
- package/dist/app/registry.mjs.map +1 -0
- package/dist/app/types.d.mts +142 -0
- package/dist/app/types.d.mts.map +1 -0
- package/dist/events/constants.d.mts +49 -0
- package/dist/events/constants.d.mts.map +1 -0
- package/dist/events/constants.mjs +46 -0
- package/dist/events/constants.mjs.map +1 -0
- package/dist/events/index.d.mts +4 -0
- package/dist/events/index.mjs +3 -0
- package/dist/events/types.d.mts +289 -0
- package/dist/events/types.d.mts.map +1 -0
- package/dist/index.d.mts +23 -0
- package/dist/index.mjs +14 -0
- package/dist/internal/id.mjs +21 -0
- package/dist/internal/id.mjs.map +1 -0
- package/dist/internal/types.d.mts +11 -0
- package/dist/internal/types.d.mts.map +1 -0
- package/dist/mcp/error/mcp-client-error.d.mts +36 -0
- package/dist/mcp/error/mcp-client-error.d.mts.map +1 -0
- package/dist/mcp/error/mcp-client-error.mjs +33 -0
- package/dist/mcp/error/mcp-client-error.mjs.map +1 -0
- package/dist/mcp/index.d.mts +8 -0
- package/dist/mcp/index.mjs +9 -0
- package/dist/mcp/tool/json-rpc-message.d.mts +50 -0
- package/dist/mcp/tool/json-rpc-message.d.mts.map +1 -0
- package/dist/mcp/tool/json-rpc-message.mjs +84 -0
- package/dist/mcp/tool/json-rpc-message.mjs.map +1 -0
- package/dist/mcp/tool/mcp-client.d.mts +71 -0
- package/dist/mcp/tool/mcp-client.d.mts.map +1 -0
- package/dist/mcp/tool/mcp-client.mjs +304 -0
- package/dist/mcp/tool/mcp-client.mjs.map +1 -0
- package/dist/mcp/tool/mcp-http-transport.d.mts +62 -0
- package/dist/mcp/tool/mcp-http-transport.d.mts.map +1 -0
- package/dist/mcp/tool/mcp-http-transport.mjs +307 -0
- package/dist/mcp/tool/mcp-http-transport.mjs.map +1 -0
- package/dist/mcp/tool/mcp-tools.d.mts +20 -0
- package/dist/mcp/tool/mcp-tools.d.mts.map +1 -0
- package/dist/mcp/tool/mcp-tools.mjs +73 -0
- package/dist/mcp/tool/mcp-tools.mjs.map +1 -0
- package/dist/mcp/tool/mcp-transport.d.mts +81 -0
- package/dist/mcp/tool/mcp-transport.d.mts.map +1 -0
- package/dist/mcp/tool/mcp-transport.mjs +11 -0
- package/dist/mcp/tool/mcp-transport.mjs.map +1 -0
- package/dist/mcp/tool/types.d.mts +230 -0
- package/dist/mcp/tool/types.d.mts.map +1 -0
- package/dist/mcp/tool/types.mjs +19 -0
- package/dist/mcp/tool/types.mjs.map +1 -0
- package/dist/persistence/index.d.mts +3 -0
- package/dist/persistence/index.mjs +3 -0
- package/dist/persistence/memory.d.mts +21 -0
- package/dist/persistence/memory.d.mts.map +1 -0
- package/dist/persistence/memory.mjs +107 -0
- package/dist/persistence/memory.mjs.map +1 -0
- package/dist/persistence/types.d.mts +124 -0
- package/dist/persistence/types.d.mts.map +1 -0
- package/dist/plugins/index.d.mts +2 -0
- package/dist/plugins/runtime.d.mts +17 -0
- package/dist/plugins/runtime.d.mts.map +1 -0
- package/dist/plugins/runtime.mjs +456 -0
- package/dist/plugins/runtime.mjs.map +1 -0
- package/dist/plugins/types.d.mts +344 -0
- package/dist/plugins/types.d.mts.map +1 -0
- package/dist/providers/index.d.mts +9 -0
- package/dist/providers/index.mjs +0 -0
- package/dist/providers/types/capabilities.d.mts +153 -0
- package/dist/providers/types/capabilities.d.mts.map +1 -0
- package/dist/providers/types/content.d.mts +125 -0
- package/dist/providers/types/content.d.mts.map +1 -0
- package/dist/providers/types/conversation.d.mts +32 -0
- package/dist/providers/types/conversation.d.mts.map +1 -0
- package/dist/providers/types/index.d.mts +8 -0
- package/dist/providers/types/input.d.mts +74 -0
- package/dist/providers/types/input.d.mts.map +1 -0
- package/dist/providers/types/model.d.mts +68 -0
- package/dist/providers/types/model.d.mts.map +1 -0
- package/dist/providers/types/output.d.mts +29 -0
- package/dist/providers/types/output.d.mts.map +1 -0
- package/dist/providers/types/response.d.mts +35 -0
- package/dist/providers/types/response.d.mts.map +1 -0
- package/dist/providers/types/tool-calls.d.mts +51 -0
- package/dist/providers/types/tool-calls.d.mts.map +1 -0
- package/dist/run/agent-loop.mjs +231 -0
- package/dist/run/agent-loop.mjs.map +1 -0
- package/dist/run/event-queue.mjs +67 -0
- package/dist/run/event-queue.mjs.map +1 -0
- package/dist/run/execute-tool-calls.mjs +550 -0
- package/dist/run/execute-tool-calls.mjs.map +1 -0
- package/dist/run/execution.mjs +93 -0
- package/dist/run/execution.mjs.map +1 -0
- package/dist/run/helpers.mjs +466 -0
- package/dist/run/helpers.mjs.map +1 -0
- package/dist/run/hooks.mjs +124 -0
- package/dist/run/hooks.mjs.map +1 -0
- package/dist/run/index.d.mts +4 -0
- package/dist/run/messages.d.mts +8 -0
- package/dist/run/messages.d.mts.map +1 -0
- package/dist/run/messages.mjs +83 -0
- package/dist/run/messages.mjs.map +1 -0
- package/dist/run/model-strategy.mjs +105 -0
- package/dist/run/model-strategy.mjs.map +1 -0
- package/dist/run/output-errors.d.mts +75 -0
- package/dist/run/output-errors.d.mts.map +1 -0
- package/dist/run/pending-tools.d.mts +1 -0
- package/dist/run/pending-tools.mjs +185 -0
- package/dist/run/pending-tools.mjs.map +1 -0
- package/dist/run/registry.mjs +22 -0
- package/dist/run/registry.mjs.map +1 -0
- package/dist/run/runtime.d.mts +19 -0
- package/dist/run/runtime.d.mts.map +1 -0
- package/dist/run/runtime.mjs +491 -0
- package/dist/run/runtime.mjs.map +1 -0
- package/dist/run/stop-conditions.mjs +41 -0
- package/dist/run/stop-conditions.mjs.map +1 -0
- package/dist/run/types.d.mts +348 -0
- package/dist/run/types.d.mts.map +1 -0
- package/dist/schema/index.d.mts +2 -0
- package/dist/schema/resolve-json-schema.d.mts +12 -0
- package/dist/schema/resolve-json-schema.d.mts.map +1 -0
- package/dist/schema/resolve-json-schema.mjs +167 -0
- package/dist/schema/resolve-json-schema.mjs.map +1 -0
- package/dist/schema/types.d.mts +27 -0
- package/dist/schema/types.d.mts.map +1 -0
- package/dist/server/create-server.d.mts +21 -0
- package/dist/server/create-server.d.mts.map +1 -0
- package/dist/server/create-server.mjs +107 -0
- package/dist/server/create-server.mjs.map +1 -0
- package/dist/server/http.mjs +182 -0
- package/dist/server/http.mjs.map +1 -0
- package/dist/server/index.d.mts +3 -0
- package/dist/server/index.mjs +3 -0
- package/dist/server/routes.mjs +399 -0
- package/dist/server/routes.mjs.map +1 -0
- package/dist/server/types.d.mts +31 -0
- package/dist/server/types.d.mts.map +1 -0
- package/dist/tools/constants.d.mts +12 -0
- package/dist/tools/constants.d.mts.map +1 -0
- package/dist/tools/constants.mjs +13 -0
- package/dist/tools/constants.mjs.map +1 -0
- package/dist/tools/define-tool.d.mts +25 -0
- package/dist/tools/define-tool.d.mts.map +1 -0
- package/dist/tools/define-tool.mjs +76 -0
- package/dist/tools/define-tool.mjs.map +1 -0
- package/dist/tools/index.d.mts +5 -0
- package/dist/tools/lazy-tools.d.mts +49 -0
- package/dist/tools/lazy-tools.d.mts.map +1 -0
- package/dist/tools/lazy-tools.mjs +87 -0
- package/dist/tools/lazy-tools.mjs.map +1 -0
- package/dist/tools/resolve-tools.d.mts +12 -0
- package/dist/tools/resolve-tools.d.mts.map +1 -0
- package/dist/tools/resolve-tools.mjs +86 -0
- package/dist/tools/resolve-tools.mjs.map +1 -0
- package/dist/tools/types.d.mts +318 -0
- package/dist/tools/types.d.mts.map +1 -0
- package/dist/tools/validation.mjs +23 -0
- package/dist/tools/validation.mjs.map +1 -0
- package/package.json +72 -0
package/README.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.mjs","names":[],"sources":["../../src/agent/constants.ts"],"sourcesContent":["export const AGENT_OUTPUT_JSON_SCHEMA = Symbol.for(\"better-agent.agent.output.json_schema\");\n"],"mappings":";AAAA,MAAa,2BAA2B,OAAO,IAAI,wCAAwC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ResolvableSchema } from "../schema/types.mjs";
|
|
2
|
+
import { Capabilities, ModalitiesParam, OutputSchemaForCaps } from "../providers/types/capabilities.mjs";
|
|
3
|
+
import { AgentContextFromSchema, AgentModelCaps, DefineAgentConfig, DefinedAgent } from "./types.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/agent/define-agent.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* Defines an agent.
|
|
8
|
+
*
|
|
9
|
+
* @param config Agent configuration.
|
|
10
|
+
* @returns The defined agent.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* const supportAgent = defineAgent({
|
|
15
|
+
* name: "support",
|
|
16
|
+
* model: openai.model("gpt-5"),
|
|
17
|
+
* instruction: "You are a helpful support agent.",
|
|
18
|
+
* tools: [getWeather],
|
|
19
|
+
* });
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
declare function defineAgent<const TName extends string, const TModel extends {
|
|
23
|
+
providerId: string;
|
|
24
|
+
modelId: string;
|
|
25
|
+
caps: Capabilities;
|
|
26
|
+
}, const TContextSchema extends ResolvableSchema | undefined = undefined, const TContext = AgentContextFromSchema<TContextSchema>, const TTools = undefined, const TOutputSchema extends OutputSchemaForCaps<AgentModelCaps<TModel>> | undefined = undefined, const TDefaultModalities extends ModalitiesParam<AgentModelCaps<TModel>> | undefined = undefined>(config: DefineAgentConfig<TName, TModel, TContextSchema, TContext, TTools, TOutputSchema, TDefaultModalities>): DefinedAgent<TName, TModel, TContextSchema, TContext, TTools, TOutputSchema, TDefaultModalities>;
|
|
27
|
+
//#endregion
|
|
28
|
+
export { defineAgent };
|
|
29
|
+
//# sourceMappingURL=define-agent.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-agent.d.mts","names":[],"sources":["../../src/agent/define-agent.ts"],"mappings":";;;;;;;;;AA0BA;;;;;;;;;;;;iBAAgB,WAAA;EAEW,UAAA;EAAoB,OAAA;EAAiB,IAAA,EAAM,YAAA;AAAA,gCACrC,gBAAA,2CACZ,sBAAA,CAAuB,cAAA,yDAEZ,mBAAA,CAAoB,cAAA,CAAe,MAAA,6DAEzD,eAAA,CAAgB,cAAA,CAAe,MAAA,2BAAA,CAGrC,MAAA,EAAQ,iBAAA,CACJ,KAAA,EACA,MAAA,EACA,cAAA,EACA,QAAA,EACA,MAAA,EACA,aAAA,EACA,kBAAA,IAEL,YAAA,CACC,KAAA,EACA,MAAA,EACA,cAAA,EACA,QAAA,EACA,MAAA,EACA,aAAA,EACA,kBAAA"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { validateAgentDefinition } from "./validation.mjs";
|
|
2
|
+
|
|
3
|
+
//#region src/agent/define-agent.ts
|
|
4
|
+
/**
|
|
5
|
+
* Defines an agent.
|
|
6
|
+
*
|
|
7
|
+
* @param config Agent configuration.
|
|
8
|
+
* @returns The defined agent.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const supportAgent = defineAgent({
|
|
13
|
+
* name: "support",
|
|
14
|
+
* model: openai.model("gpt-5"),
|
|
15
|
+
* instruction: "You are a helpful support agent.",
|
|
16
|
+
* tools: [getWeather],
|
|
17
|
+
* });
|
|
18
|
+
* ```
|
|
19
|
+
*/
|
|
20
|
+
function defineAgent(config) {
|
|
21
|
+
validateAgentDefinition(config);
|
|
22
|
+
return config;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
//#endregion
|
|
26
|
+
export { defineAgent };
|
|
27
|
+
//# sourceMappingURL=define-agent.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-agent.mjs","names":[],"sources":["../../src/agent/define-agent.ts"],"sourcesContent":["import type { Capabilities, ModalitiesParam, OutputSchemaForCaps } from \"../providers\";\nimport type { ResolvableSchema } from \"../schema\";\nimport type {\n AgentContextFromSchema,\n AgentModelCaps,\n DefineAgentConfig,\n DefinedAgent,\n} from \"./types\";\nimport { validateAgentDefinition } from \"./validation\";\n\n/**\n * Defines an agent.\n *\n * @param config Agent configuration.\n * @returns The defined agent.\n *\n * @example\n * ```ts\n * const supportAgent = defineAgent({\n * name: \"support\",\n * model: openai.model(\"gpt-5\"),\n * instruction: \"You are a helpful support agent.\",\n * tools: [getWeather],\n * });\n * ```\n */\nexport function defineAgent<\n const TName extends string,\n const TModel extends { providerId: string; modelId: string; caps: Capabilities },\n const TContextSchema extends ResolvableSchema | undefined = undefined,\n const TContext = AgentContextFromSchema<TContextSchema>,\n const TTools = undefined,\n const TOutputSchema extends OutputSchemaForCaps<AgentModelCaps<TModel>> | undefined = undefined,\n const TDefaultModalities extends\n | ModalitiesParam<AgentModelCaps<TModel>>\n | undefined = undefined,\n>(\n config: DefineAgentConfig<\n TName,\n TModel,\n TContextSchema,\n TContext,\n TTools,\n TOutputSchema,\n TDefaultModalities\n >,\n): DefinedAgent<\n TName,\n TModel,\n TContextSchema,\n TContext,\n TTools,\n TOutputSchema,\n TDefaultModalities\n> {\n validateAgentDefinition(config);\n\n return config as DefinedAgent<\n TName,\n TModel,\n TContextSchema,\n TContext,\n TTools,\n TOutputSchema,\n TDefaultModalities\n >;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AA0BA,SAAgB,YAWZ,QAiBF;AACE,yBAAwB,OAAO;AAE/B,QAAO"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { AgentContext, AgentContextFromSchema, AgentContextSchema, AgentConversationReplayOptions, AgentDefinition, AgentInstruction, AgentKnownToolName, AgentModelCaps, AgentModelOptions, AgentOnStep, AgentOnStepFinish, AgentOutputSchema, AgentStructuredOutput, AgentTools, AnyAgentDefinition, DefineAgentConfig, DefinedAgent } from "./types.mjs";
|
|
2
|
+
import { defineAgent } from "./define-agent.mjs";
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { Awaitable, BivariantFn } from "../internal/types.mjs";
|
|
2
|
+
import { InferSchemaInput, ResolvableSchema } from "../schema/types.mjs";
|
|
3
|
+
import { Capabilities, InferOutputSchema, InstructionEnabled, ModalitiesParam, ModalityOptionsFor, OutputSchemaDefinition, OutputSchemaForCaps } from "../providers/types/capabilities.mjs";
|
|
4
|
+
import { OnToolError, OpenString, ToolErrorMode, ToolNamesOf, ToolSource } from "../tools/types.mjs";
|
|
5
|
+
import { GenerativeModelInputMessageContent, ModelOptions } from "../providers/types/input.mjs";
|
|
6
|
+
import { GenerativeModel } from "../providers/types/model.mjs";
|
|
7
|
+
import { ConversationReplayOptions, OnStepContext, OnStepFinishContext, RunAdvancedOptions, StopWhen } from "../run/types.mjs";
|
|
8
|
+
import { OnOutputError, OutputErrorMode } from "../run/output-errors.mjs";
|
|
9
|
+
//#region src/agent/types.d.ts
|
|
10
|
+
/**
|
|
11
|
+
* Defines an agent.
|
|
12
|
+
*/
|
|
13
|
+
type AgentConversationReplayOptions = Omit<ConversationReplayOptions, "prepareInput"> & {
|
|
14
|
+
prepareInput?: Exclude<ConversationReplayOptions["prepareInput"], null>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Defines an agent.
|
|
18
|
+
*/
|
|
19
|
+
interface AgentDefinition<TName extends string = string, TModel extends AnyAgentModel = AnyAgentModel, TContextSchema extends ResolvableSchema | undefined = undefined, TContext = AgentContextFromSchema<TContextSchema>, TTools = undefined, TOutputSchema extends OutputSchemaForCaps<AgentModelCaps<TModel>> | undefined = undefined, TDefaultModalities extends ModalitiesParam<AgentModelCaps<TModel>> | undefined = undefined> {
|
|
20
|
+
/** Stable agent name. */
|
|
21
|
+
name: TName;
|
|
22
|
+
/** Short description for humans. */
|
|
23
|
+
description?: string;
|
|
24
|
+
/** Model used for runs. */
|
|
25
|
+
model: TModel;
|
|
26
|
+
/**
|
|
27
|
+
* Default model options for this agent's runs.
|
|
28
|
+
*
|
|
29
|
+
* Per-run overrides always win.
|
|
30
|
+
*/
|
|
31
|
+
defaultModelOptions?: AgentModelOptions<TModel> & ModalityOptionsFor<AgentModelCaps<TModel>, TDefaultModalities>;
|
|
32
|
+
/**
|
|
33
|
+
* Default output modalities for this agent's runs.
|
|
34
|
+
*
|
|
35
|
+
* Per-run modalities always win.
|
|
36
|
+
*/
|
|
37
|
+
defaultModalities?: TDefaultModalities;
|
|
38
|
+
/**
|
|
39
|
+
* Default system instruction.
|
|
40
|
+
*
|
|
41
|
+
* Can be static or derived from validated context.
|
|
42
|
+
*/
|
|
43
|
+
instruction?: AgentInstruction<TContext, AgentModelCaps<TModel>>;
|
|
44
|
+
/** Optional schema used to validate run context. */
|
|
45
|
+
contextSchema?: TContextSchema;
|
|
46
|
+
/**
|
|
47
|
+
* Default structured output schema.
|
|
48
|
+
*
|
|
49
|
+
* Requires model with `outputModalities: { text: true }`.
|
|
50
|
+
*/
|
|
51
|
+
outputSchema?: TOutputSchema;
|
|
52
|
+
/** Tools available to the agent. */
|
|
53
|
+
tools?: TTools;
|
|
54
|
+
/** Default handling mode for recoverable tool failures. */
|
|
55
|
+
toolErrorMode?: ToolErrorMode;
|
|
56
|
+
/** Optional hook for customizing recoverable tool failures. */
|
|
57
|
+
onToolError?: OnToolError;
|
|
58
|
+
/** Default handling mode for structured output finalization failures. */
|
|
59
|
+
outputErrorMode?: OutputErrorMode;
|
|
60
|
+
/** Optional hook for customizing structured output finalization failures. */
|
|
61
|
+
onOutputError?: OnOutputError;
|
|
62
|
+
/**
|
|
63
|
+
* Maximum number of loop steps per run.
|
|
64
|
+
*
|
|
65
|
+
* When omitted, a run stops naturally or when `stopWhen` returns `true`.
|
|
66
|
+
*/
|
|
67
|
+
maxSteps?: number;
|
|
68
|
+
/** Advanced runtime defaults for interactive flows. */
|
|
69
|
+
advanced?: RunAdvancedOptions;
|
|
70
|
+
/** Default replay shaping for stored conversation history used by this agent. */
|
|
71
|
+
conversationReplay?: AgentConversationReplayOptions;
|
|
72
|
+
/** Optional stop condition checked after each completed step. */
|
|
73
|
+
stopWhen?: StopWhen<TContextSchema, TContext>;
|
|
74
|
+
/** Optional hook called before each step starts. */
|
|
75
|
+
onStep?: AgentOnStep<TContextSchema, TContext>;
|
|
76
|
+
/** Optional hook called after each step completes. */
|
|
77
|
+
onStepFinish?: AgentOnStepFinish<TContextSchema, TContext>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Broad agent definition type for heterogeneous collections.
|
|
81
|
+
*/
|
|
82
|
+
type AnyAgentDefinition = {
|
|
83
|
+
name: string;
|
|
84
|
+
description?: string;
|
|
85
|
+
model: any;
|
|
86
|
+
defaultModelOptions?: Record<string, unknown>;
|
|
87
|
+
defaultModalities?: ModalitiesParam<Capabilities>;
|
|
88
|
+
instruction?: unknown;
|
|
89
|
+
contextSchema?: ResolvableSchema | undefined;
|
|
90
|
+
outputSchema?: OutputSchemaDefinition | undefined;
|
|
91
|
+
tools?: unknown;
|
|
92
|
+
toolErrorMode?: ToolErrorMode;
|
|
93
|
+
onToolError?: OnToolError;
|
|
94
|
+
outputErrorMode?: OutputErrorMode;
|
|
95
|
+
onOutputError?: OnOutputError;
|
|
96
|
+
maxSteps?: number;
|
|
97
|
+
advanced?: RunAdvancedOptions;
|
|
98
|
+
conversationReplay?: AgentConversationReplayOptions;
|
|
99
|
+
stopWhen?: StopWhen<any, any>;
|
|
100
|
+
onStep?: AgentOnStep<any, any, Capabilities>;
|
|
101
|
+
onStepFinish?: AgentOnStepFinish<any, any>;
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Concrete agent shape after all generics are resolved.
|
|
105
|
+
*/
|
|
106
|
+
type DefinedAgent<TName extends string, TModel extends AnyAgentModel, TContextSchema extends ResolvableSchema | undefined, TContext, TTools, TOutputSchema extends OutputSchemaForCaps<AgentModelCaps<TModel>> | undefined, TDefaultModalities extends ModalitiesParam<AgentModelCaps<TModel>> | undefined> = {
|
|
107
|
+
name: TName;
|
|
108
|
+
description?: string;
|
|
109
|
+
model: TModel;
|
|
110
|
+
defaultModelOptions?: AgentModelOptions<TModel> & ModalityOptionsFor<AgentModelCaps<TModel>, TDefaultModalities>;
|
|
111
|
+
defaultModalities?: TDefaultModalities;
|
|
112
|
+
instruction?: AgentInstruction<TContext, AgentModelCaps<TModel>>;
|
|
113
|
+
tools?: TTools;
|
|
114
|
+
toolErrorMode?: ToolErrorMode;
|
|
115
|
+
onToolError?: OnToolError;
|
|
116
|
+
outputErrorMode?: OutputErrorMode;
|
|
117
|
+
onOutputError?: OnOutputError;
|
|
118
|
+
maxSteps?: number;
|
|
119
|
+
advanced?: RunAdvancedOptions;
|
|
120
|
+
conversationReplay?: AgentConversationReplayOptions;
|
|
121
|
+
stopWhen?: StopWhen<TContextSchema, TContext>;
|
|
122
|
+
onStep?: AgentOnStep<TContextSchema, TContext, any>;
|
|
123
|
+
onStepFinish?: AgentOnStepFinish<TContextSchema, TContext>;
|
|
124
|
+
} & ([TContextSchema] extends [undefined] ? {
|
|
125
|
+
contextSchema?: undefined;
|
|
126
|
+
} : {
|
|
127
|
+
contextSchema: TContextSchema;
|
|
128
|
+
}) & ([TOutputSchema] extends [undefined] ? {
|
|
129
|
+
outputSchema?: undefined;
|
|
130
|
+
} : {
|
|
131
|
+
outputSchema: TOutputSchema;
|
|
132
|
+
});
|
|
133
|
+
type DefineAgentConfig<TName extends string, TModel extends AnyAgentModel, TContextSchema extends ResolvableSchema | undefined, TContext, TTools, TOutputSchema extends OutputSchemaForCaps<AgentModelCaps<TModel>> | undefined, TDefaultModalities extends ModalitiesParam<AgentModelCaps<TModel>> | undefined> = Omit<AgentDefinition<TName, TModel, TContextSchema, TContext, TTools, TOutputSchema, TDefaultModalities>, "outputSchema" | "outputErrorMode" | "onOutputError" | "tools" | "toolErrorMode" | "onToolError" | "instruction" | "onStep"> & DefineAgentInstructionField<TModel, TContext> & DefineAgentToolFields<TModel, TContext, TTools> & DefineAgentHookFields<TModel, TContextSchema, TContext> & DefineAgentOutputSchemaField<TModel, TOutputSchema> & DefineAgentOutputErrorFields<TModel>;
|
|
134
|
+
/**
|
|
135
|
+
* Instruction value accepted by an agent.
|
|
136
|
+
*/
|
|
137
|
+
type AgentInstruction<TContext = unknown, TModelCaps extends Capabilities = Capabilities> = InstructionEnabled<TModelCaps> extends true ? GenerativeModelInputMessageContent<TModelCaps> | BivariantFn<[TContext], GenerativeModelInputMessageContent<TModelCaps>> : never;
|
|
138
|
+
/**
|
|
139
|
+
* Tool sources accepted by an agent.
|
|
140
|
+
*/
|
|
141
|
+
type AgentTools<TContext = unknown> = ToolSource<TContext> | readonly ToolSource<TContext>[];
|
|
142
|
+
/**
|
|
143
|
+
* `onStep` hook for an agent.
|
|
144
|
+
*/
|
|
145
|
+
type AgentOnStep<TContextSchema extends ResolvableSchema | undefined = undefined, TContext = unknown, TModelCaps extends Capabilities = Capabilities> = BivariantFn<[OnStepContext<TContextSchema, TContext, TModelCaps>], Awaitable<void>>;
|
|
146
|
+
/**
|
|
147
|
+
* `onStepFinish` hook for an agent.
|
|
148
|
+
*/
|
|
149
|
+
type AgentOnStepFinish<TContextSchema extends ResolvableSchema | undefined = undefined, TContext = unknown> = (context: OnStepFinishContext<TContextSchema, TContext>) => Awaitable<void>;
|
|
150
|
+
/**
|
|
151
|
+
* Provider-specific model options accepted by an agent's model.
|
|
152
|
+
*/
|
|
153
|
+
type AgentModelOptions<TModel> = TModel extends GenerativeModel<infer TOptions, infer _TProviderId, infer _TModelId, infer _TCaps> ? ModelOptions<TOptions> : Record<never, never>;
|
|
154
|
+
/**
|
|
155
|
+
* Infers the validated context type from a context schema.
|
|
156
|
+
*/
|
|
157
|
+
type AgentContextFromSchema<TSchema> = [TSchema] extends [undefined] ? unknown : InferSchemaInput<NonNullable<TSchema>>;
|
|
158
|
+
/**
|
|
159
|
+
* Extracts the validated context type from an agent.
|
|
160
|
+
*/
|
|
161
|
+
type AgentContext<TAgent> = TAgent extends AgentDefinition<infer _TName, infer _TModel, infer _TContextSchema, infer TContext, infer _TTools, infer _TOutputSchema, infer _TDefaultModalities> ? TContext : unknown;
|
|
162
|
+
/**
|
|
163
|
+
* Extracts the declared context schema from an agent.
|
|
164
|
+
*/
|
|
165
|
+
type AgentContextSchema<TAgent> = TAgent extends AgentDefinition<infer _TName, infer _TModel, infer _TContextSchema, infer _TContext, infer _TTools, infer _TOutputSchema, infer _TDefaultModalities> ? TAgent extends {
|
|
166
|
+
contextSchema: infer TContextSchema;
|
|
167
|
+
} ? TContextSchema : undefined : undefined;
|
|
168
|
+
/**
|
|
169
|
+
* Extracts the default output schema from an agent.
|
|
170
|
+
*/
|
|
171
|
+
type AgentOutputSchema<TAgent> = TAgent extends AgentDefinition<infer _TName, infer _TModel, infer _TContextSchema, infer _TContext, infer _TTools, infer _TOutputSchema, infer _TDefaultModalities> ? TAgent extends {
|
|
172
|
+
outputSchema: infer TOutputSchema;
|
|
173
|
+
} ? TOutputSchema : undefined : undefined;
|
|
174
|
+
/**
|
|
175
|
+
* Infers the structured output payload produced by an agent.
|
|
176
|
+
*/
|
|
177
|
+
type AgentStructuredOutput<TAgent> = InferOutputSchema<AgentOutputSchema<TAgent>>;
|
|
178
|
+
/**
|
|
179
|
+
* Static tool-name union for an agent.
|
|
180
|
+
*/
|
|
181
|
+
type AgentKnownToolName<TAgent> = TAgent extends AgentDefinition<infer _TName, infer _TModel, infer _TContextSchema, infer _TContext, infer TTools, infer _TOutputSchema, infer _TDefaultModalities> ? OpenString<ToolNamesOf<NonNullable<TTools>>> : string;
|
|
182
|
+
type AnyAgentModel = {
|
|
183
|
+
readonly providerId: string;
|
|
184
|
+
readonly modelId: string;
|
|
185
|
+
readonly caps: Capabilities;
|
|
186
|
+
doGenerate?(...args: any[]): unknown;
|
|
187
|
+
doGenerateStream?(...args: any[]): unknown;
|
|
188
|
+
};
|
|
189
|
+
type AgentModelCaps<TModel> = TModel extends {
|
|
190
|
+
caps: infer TCaps extends Capabilities;
|
|
191
|
+
} ? TCaps : Capabilities;
|
|
192
|
+
type DefineAgentOutputSchemaField<TModel extends AnyAgentModel, TOutputSchema extends OutputSchemaForCaps<AgentModelCaps<TModel>> | undefined> = [OutputSchemaForCaps<AgentModelCaps<TModel>>] extends [never] ? object : {
|
|
193
|
+
/** Optional default structured output schema for runs that do not override `output`. */outputSchema?: TOutputSchema;
|
|
194
|
+
};
|
|
195
|
+
type DefineAgentOutputErrorFields<TModel extends AnyAgentModel> = [OutputSchemaForCaps<AgentModelCaps<TModel>>] extends [never] ? object : {
|
|
196
|
+
/** Default handling mode for structured output finalization failures. */outputErrorMode?: OutputErrorMode; /** Optional hook for customizing structured output finalization failures. */
|
|
197
|
+
onOutputError?: OnOutputError;
|
|
198
|
+
};
|
|
199
|
+
type DefineAgentInstructionField<TModel extends AnyAgentModel, TContext> = InstructionEnabled<AgentModelCaps<TModel>> extends true ? {
|
|
200
|
+
/**
|
|
201
|
+
* Main instruction for the agent.
|
|
202
|
+
* Can be static or derived from validated context.
|
|
203
|
+
*/
|
|
204
|
+
instruction?: AgentInstruction<TContext, AgentModelCaps<TModel>>;
|
|
205
|
+
} : object;
|
|
206
|
+
type DefineAgentToolFields<TModel extends AnyAgentModel, _TContext, TTools> = AgentModelCaps<TModel>["tools"] extends true ? {
|
|
207
|
+
/** Tools available to the agent. */tools?: TTools; /** Default handling mode for recoverable tool failures. */
|
|
208
|
+
toolErrorMode?: ToolErrorMode; /** Optional hook for customizing recoverable tool failures. */
|
|
209
|
+
onToolError?: OnToolError;
|
|
210
|
+
} : object;
|
|
211
|
+
type DefineAgentHookFields<TModel extends AnyAgentModel, TContextSchema extends ResolvableSchema | undefined, TContext> = {
|
|
212
|
+
/** Optional hook called before each step starts. */onStep?: AgentOnStep<TContextSchema, TContext, AgentModelCaps<TModel>>;
|
|
213
|
+
};
|
|
214
|
+
//#endregion
|
|
215
|
+
export { AgentContext, AgentContextFromSchema, AgentContextSchema, AgentConversationReplayOptions, AgentDefinition, AgentInstruction, AgentKnownToolName, AgentModelCaps, AgentModelOptions, AgentOnStep, AgentOnStepFinish, AgentOutputSchema, AgentStructuredOutput, AgentTools, AnyAgentDefinition, DefineAgentConfig, DefinedAgent };
|
|
216
|
+
//# sourceMappingURL=types.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.mts","names":[],"sources":["../../src/agent/types.ts"],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { resolveToJsonSchema } from "../schema/resolve-json-schema.mjs";
|
|
2
|
+
import { AGENT_OUTPUT_JSON_SCHEMA } from "./constants.mjs";
|
|
3
|
+
import { BetterAgentError } from "@better-agent/shared/errors";
|
|
4
|
+
|
|
5
|
+
//#region src/agent/validation.ts
|
|
6
|
+
const cachePreflightedOutputSchema = (agent, schema) => {
|
|
7
|
+
Object.defineProperty(agent, AGENT_OUTPUT_JSON_SCHEMA, {
|
|
8
|
+
value: schema,
|
|
9
|
+
configurable: true,
|
|
10
|
+
writable: true
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
const validateOptionalPositiveNumber = (value, field, traceAt, context) => {
|
|
14
|
+
if (value !== void 0 && (!Number.isFinite(value) || value <= 0)) throw BetterAgentError.fromCode("VALIDATION_FAILED", `${field} must be a positive number.`, {
|
|
15
|
+
context: {
|
|
16
|
+
[field]: value,
|
|
17
|
+
...context ?? {}
|
|
18
|
+
},
|
|
19
|
+
trace: [{ at: traceAt }]
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Validates one agent definition and caches any preflighted structured output schema.
|
|
24
|
+
*/
|
|
25
|
+
const validateAgentDefinition = (agent) => {
|
|
26
|
+
if (typeof agent.name !== "string" || agent.name.length === 0) throw BetterAgentError.fromCode("VALIDATION_FAILED", "Agent name must be a non-empty string.", { trace: [{ at: "core.agent.validateAgentDefinition.name" }] });
|
|
27
|
+
if (agent.model === void 0 || agent.model === null) throw BetterAgentError.fromCode("VALIDATION_FAILED", `Agent '${agent.name}' must have a model.`, {
|
|
28
|
+
context: { agentName: agent.name },
|
|
29
|
+
trace: [{ at: "core.agent.validateAgentDefinition.model" }]
|
|
30
|
+
});
|
|
31
|
+
validateOptionalPositiveNumber(agent.advanced?.clientToolResultTimeoutMs, "clientToolResultTimeoutMs", "core.agent.validateAgentDefinition.advanced.clientToolResultTimeoutMs", { agentName: agent.name });
|
|
32
|
+
validateOptionalPositiveNumber(agent.advanced?.toolApprovalTimeoutMs, "toolApprovalTimeoutMs", "core.agent.validateAgentDefinition.advanced.toolApprovalTimeoutMs", { agentName: agent.name });
|
|
33
|
+
if (agent.conversationReplay?.omitUnsupportedParts !== void 0 && typeof agent.conversationReplay.omitUnsupportedParts !== "boolean") throw BetterAgentError.fromCode("VALIDATION_FAILED", "conversationReplay.omitUnsupportedParts must be a boolean.", {
|
|
34
|
+
context: { agentName: agent.name },
|
|
35
|
+
trace: [{ at: "core.agent.validateAgentDefinition.conversationReplay.omitUnsupportedParts" }]
|
|
36
|
+
});
|
|
37
|
+
if (agent.conversationReplay?.prepareInput !== void 0 && typeof agent.conversationReplay.prepareInput !== "function") throw BetterAgentError.fromCode("VALIDATION_FAILED", "conversationReplay.prepareInput must be a function.", {
|
|
38
|
+
context: { agentName: agent.name },
|
|
39
|
+
trace: [{ at: "core.agent.validateAgentDefinition.conversationReplay.prepareInput" }]
|
|
40
|
+
});
|
|
41
|
+
if (agent.outputSchema !== void 0 && agent[AGENT_OUTPUT_JSON_SCHEMA] === void 0) {
|
|
42
|
+
const resolvedSchema = resolveToJsonSchema(agent.outputSchema.schema);
|
|
43
|
+
if (resolvedSchema.isErr()) throw resolvedSchema.error.at({
|
|
44
|
+
at: "core.agent.validateAgentDefinition.outputSchema",
|
|
45
|
+
data: { agentName: agent.name }
|
|
46
|
+
});
|
|
47
|
+
cachePreflightedOutputSchema(agent, resolvedSchema.value);
|
|
48
|
+
}
|
|
49
|
+
const contextStandard = agent.contextSchema?.["~standard"];
|
|
50
|
+
const contextJsonSchema = contextStandard && typeof contextStandard === "object" ? contextStandard.jsonSchema : void 0;
|
|
51
|
+
if (agent.contextSchema !== void 0 && (contextJsonSchema !== void 0 || contextStandard === void 0)) {
|
|
52
|
+
const resolvedSchema = resolveToJsonSchema(agent.contextSchema);
|
|
53
|
+
if (resolvedSchema.isErr()) throw resolvedSchema.error.at({
|
|
54
|
+
at: "core.agent.validateAgentDefinition.contextSchema",
|
|
55
|
+
data: { agentName: agent.name }
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
return agent;
|
|
59
|
+
};
|
|
60
|
+
const getPreflightedOutputSchema = (agent) => agent[AGENT_OUTPUT_JSON_SCHEMA];
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
export { getPreflightedOutputSchema, validateAgentDefinition };
|
|
64
|
+
//# sourceMappingURL=validation.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.mjs","names":[],"sources":["../../src/agent/validation.ts"],"sourcesContent":["import { BetterAgentError } from \"@better-agent/shared/errors\";\nimport { resolveToJsonSchema } from \"../schema\";\nimport type { ResolvableSchema, ValidatableSchema } from \"../schema\";\nimport { AGENT_OUTPUT_JSON_SCHEMA } from \"./constants\";\n\ntype AgentValidationTarget = {\n name?: unknown;\n model?: unknown;\n maxSteps?: number;\n conversationReplay?: {\n omitUnsupportedParts?: boolean;\n prepareInput?: unknown;\n };\n advanced?: {\n clientToolResultTimeoutMs?: number;\n toolApprovalTimeoutMs?: number;\n };\n contextSchema?: ValidatableSchema | undefined;\n outputSchema?: {\n schema: ResolvableSchema;\n };\n [AGENT_OUTPUT_JSON_SCHEMA]?: Record<string, unknown>;\n};\n\nconst cachePreflightedOutputSchema = (\n agent: AgentValidationTarget,\n schema: Record<string, unknown>,\n): void => {\n Object.defineProperty(agent, AGENT_OUTPUT_JSON_SCHEMA, {\n value: schema,\n configurable: true,\n writable: true,\n });\n};\n\nconst validateOptionalPositiveNumber = (\n value: number | undefined,\n field: string,\n traceAt: string,\n context?: Record<string, unknown>,\n) => {\n if (value !== undefined && (!Number.isFinite(value) || value <= 0)) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n `${field} must be a positive number.`,\n {\n context: {\n [field]: value,\n ...(context ?? {}),\n },\n trace: [{ at: traceAt }],\n },\n );\n }\n};\n\n/**\n * Validates one agent definition and caches any preflighted structured output schema.\n */\nexport const validateAgentDefinition = <const TAgent extends AgentValidationTarget>(\n agent: TAgent,\n): TAgent => {\n if (typeof agent.name !== \"string\" || agent.name.length === 0) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n \"Agent name must be a non-empty string.\",\n {\n trace: [{ at: \"core.agent.validateAgentDefinition.name\" }],\n },\n );\n }\n\n if (agent.model === undefined || agent.model === null) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n `Agent '${agent.name}' must have a model.`,\n {\n context: { agentName: agent.name },\n trace: [{ at: \"core.agent.validateAgentDefinition.model\" }],\n },\n );\n }\n\n validateOptionalPositiveNumber(\n agent.advanced?.clientToolResultTimeoutMs,\n \"clientToolResultTimeoutMs\",\n \"core.agent.validateAgentDefinition.advanced.clientToolResultTimeoutMs\",\n { agentName: agent.name },\n );\n validateOptionalPositiveNumber(\n agent.advanced?.toolApprovalTimeoutMs,\n \"toolApprovalTimeoutMs\",\n \"core.agent.validateAgentDefinition.advanced.toolApprovalTimeoutMs\",\n { agentName: agent.name },\n );\n\n if (\n agent.conversationReplay?.omitUnsupportedParts !== undefined &&\n typeof agent.conversationReplay.omitUnsupportedParts !== \"boolean\"\n ) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n \"conversationReplay.omitUnsupportedParts must be a boolean.\",\n {\n context: { agentName: agent.name },\n trace: [\n {\n at: \"core.agent.validateAgentDefinition.conversationReplay.omitUnsupportedParts\",\n },\n ],\n },\n );\n }\n\n if (\n agent.conversationReplay?.prepareInput !== undefined &&\n typeof agent.conversationReplay.prepareInput !== \"function\"\n ) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n \"conversationReplay.prepareInput must be a function.\",\n {\n context: { agentName: agent.name },\n trace: [\n { at: \"core.agent.validateAgentDefinition.conversationReplay.prepareInput\" },\n ],\n },\n );\n }\n\n if (agent.outputSchema !== undefined && agent[AGENT_OUTPUT_JSON_SCHEMA] === undefined) {\n const resolvedSchema = resolveToJsonSchema(agent.outputSchema.schema);\n if (resolvedSchema.isErr()) {\n throw resolvedSchema.error.at({\n at: \"core.agent.validateAgentDefinition.outputSchema\",\n data: { agentName: agent.name },\n });\n }\n\n cachePreflightedOutputSchema(agent, resolvedSchema.value);\n }\n\n const contextStandard = (agent.contextSchema as { \"~standard\"?: unknown })?.[\"~standard\"];\n const contextJsonSchema =\n contextStandard && typeof contextStandard === \"object\"\n ? (contextStandard as { jsonSchema?: unknown }).jsonSchema\n : undefined;\n\n if (\n agent.contextSchema !== undefined &&\n (contextJsonSchema !== undefined || contextStandard === undefined)\n ) {\n const resolvedSchema = resolveToJsonSchema(agent.contextSchema as ResolvableSchema);\n if (resolvedSchema.isErr()) {\n throw resolvedSchema.error.at({\n at: \"core.agent.validateAgentDefinition.contextSchema\",\n data: { agentName: agent.name },\n });\n }\n }\n\n return agent;\n};\n\nexport const getPreflightedOutputSchema = (agent: object): Record<string, unknown> | undefined =>\n (agent as { [AGENT_OUTPUT_JSON_SCHEMA]?: Record<string, unknown> })[AGENT_OUTPUT_JSON_SCHEMA];\n"],"mappings":";;;;;AAwBA,MAAM,gCACF,OACA,WACO;AACP,QAAO,eAAe,OAAO,0BAA0B;EACnD,OAAO;EACP,cAAc;EACd,UAAU;EACb,CAAC;;AAGN,MAAM,kCACF,OACA,OACA,SACA,YACC;AACD,KAAI,UAAU,WAAc,CAAC,OAAO,SAAS,MAAM,IAAI,SAAS,GAC5D,OAAM,iBAAiB,SACnB,qBACA,GAAG,MAAM,8BACT;EACI,SAAS;IACJ,QAAQ;GACT,GAAI,WAAW,EAAE;GACpB;EACD,OAAO,CAAC,EAAE,IAAI,SAAS,CAAC;EAC3B,CACJ;;;;;AAOT,MAAa,2BACT,UACS;AACT,KAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,EACxD,OAAM,iBAAiB,SACnB,qBACA,0CACA,EACI,OAAO,CAAC,EAAE,IAAI,2CAA2C,CAAC,EAC7D,CACJ;AAGL,KAAI,MAAM,UAAU,UAAa,MAAM,UAAU,KAC7C,OAAM,iBAAiB,SACnB,qBACA,UAAU,MAAM,KAAK,uBACrB;EACI,SAAS,EAAE,WAAW,MAAM,MAAM;EAClC,OAAO,CAAC,EAAE,IAAI,4CAA4C,CAAC;EAC9D,CACJ;AAGL,gCACI,MAAM,UAAU,2BAChB,6BACA,yEACA,EAAE,WAAW,MAAM,MAAM,CAC5B;AACD,gCACI,MAAM,UAAU,uBAChB,yBACA,qEACA,EAAE,WAAW,MAAM,MAAM,CAC5B;AAED,KACI,MAAM,oBAAoB,yBAAyB,UACnD,OAAO,MAAM,mBAAmB,yBAAyB,UAEzD,OAAM,iBAAiB,SACnB,qBACA,8DACA;EACI,SAAS,EAAE,WAAW,MAAM,MAAM;EAClC,OAAO,CACH,EACI,IAAI,8EACP,CACJ;EACJ,CACJ;AAGL,KACI,MAAM,oBAAoB,iBAAiB,UAC3C,OAAO,MAAM,mBAAmB,iBAAiB,WAEjD,OAAM,iBAAiB,SACnB,qBACA,uDACA;EACI,SAAS,EAAE,WAAW,MAAM,MAAM;EAClC,OAAO,CACH,EAAE,IAAI,sEAAsE,CAC/E;EACJ,CACJ;AAGL,KAAI,MAAM,iBAAiB,UAAa,MAAM,8BAA8B,QAAW;EACnF,MAAM,iBAAiB,oBAAoB,MAAM,aAAa,OAAO;AACrE,MAAI,eAAe,OAAO,CACtB,OAAM,eAAe,MAAM,GAAG;GAC1B,IAAI;GACJ,MAAM,EAAE,WAAW,MAAM,MAAM;GAClC,CAAC;AAGN,+BAA6B,OAAO,eAAe,MAAM;;CAG7D,MAAM,kBAAmB,MAAM,gBAA8C;CAC7E,MAAM,oBACF,mBAAmB,OAAO,oBAAoB,WACvC,gBAA6C,aAC9C;AAEV,KACI,MAAM,kBAAkB,WACvB,sBAAsB,UAAa,oBAAoB,SAC1D;EACE,MAAM,iBAAiB,oBAAoB,MAAM,cAAkC;AACnF,MAAI,eAAe,OAAO,CACtB,OAAM,eAAe,MAAM,GAAG;GAC1B,IAAI;GACJ,MAAM,EAAE,WAAW,MAAM,MAAM;GAClC,CAAC;;AAIV,QAAO;;AAGX,MAAa,8BAA8B,UACtC,MAAmE"}
|
package/dist/api.d.mts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.mts","names":[],"sources":["../src/api.ts"],"mappings":";;AAGA;;KAAY,UAAA"}
|
package/dist/api.mjs
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
//#region src/api.ts
|
|
2
|
+
/**
|
|
3
|
+
* Defines one typed route entry.
|
|
4
|
+
*/
|
|
5
|
+
const defineRoute = (route) => route;
|
|
6
|
+
/**
|
|
7
|
+
* Matches a URL path against a route pattern.
|
|
8
|
+
*/
|
|
9
|
+
const matchRoutePath = (pattern, path) => {
|
|
10
|
+
const routeParts = pattern.split("/").filter(Boolean);
|
|
11
|
+
const pathParts = path.split("/").filter(Boolean);
|
|
12
|
+
if (routeParts.length !== pathParts.length) return null;
|
|
13
|
+
const params = {};
|
|
14
|
+
for (let index = 0; index < routeParts.length; index += 1) {
|
|
15
|
+
const expected = routeParts[index];
|
|
16
|
+
const actual = pathParts[index];
|
|
17
|
+
if (expected === void 0 || actual === void 0) return null;
|
|
18
|
+
if (expected.startsWith(":")) {
|
|
19
|
+
params[expected.slice(1)] = actual;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
if (expected !== actual) return null;
|
|
23
|
+
}
|
|
24
|
+
return params;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Creates a simple method-aware router from a route table.
|
|
28
|
+
*/
|
|
29
|
+
const createRouter = (routes) => ({
|
|
30
|
+
routes,
|
|
31
|
+
match(method, path) {
|
|
32
|
+
for (const route of routes) {
|
|
33
|
+
if (route.method !== method) continue;
|
|
34
|
+
const params = matchRoutePath(route.pattern, path);
|
|
35
|
+
if (params) return {
|
|
36
|
+
route,
|
|
37
|
+
params
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
},
|
|
42
|
+
matchPath(path) {
|
|
43
|
+
const methods = [];
|
|
44
|
+
let firstMatch = null;
|
|
45
|
+
for (const route of routes) {
|
|
46
|
+
const params = matchRoutePath(route.pattern, path);
|
|
47
|
+
if (!params) continue;
|
|
48
|
+
methods.push(route.method);
|
|
49
|
+
if (!firstMatch) firstMatch = {
|
|
50
|
+
route,
|
|
51
|
+
params
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
return firstMatch ? {
|
|
55
|
+
...firstMatch,
|
|
56
|
+
methods
|
|
57
|
+
} : null;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
//#endregion
|
|
62
|
+
export { createRouter, defineRoute };
|
|
63
|
+
//# sourceMappingURL=api.mjs.map
|
package/dist/api.mjs.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.mjs","names":[],"sources":["../src/api.ts"],"sourcesContent":["/**\n * Supported HTTP methods for Better Agent routes.\n */\nexport type HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\" | \"OPTIONS\";\n\n/**\n * Path params extracted from a matched route.\n */\nexport type RouteParams = Record<string, string>;\n\n/**\n * Context passed to a route handler.\n */\nexport interface RouteContext<P extends RouteParams = RouteParams> {\n request: Request;\n path: string;\n params: P;\n query: URLSearchParams;\n}\n\n/**\n * One route entry in the server router.\n */\nexport interface RouteEntry<Path extends string = string> {\n method: HttpMethod;\n pattern: Path;\n public?: boolean;\n handler(ctx: RouteContext<ParamsFromPath<Path>>): Response | Promise<Response>;\n}\n\n/**\n * Route table consumed by the router.\n */\nexport type RouteTable = RouteEntry[];\n\n/**\n * Successful route match for one method and path.\n */\nexport interface RouteMatch {\n route: RouteEntry;\n params: RouteParams;\n}\n\n/**\n * Route match for a path regardless of method.\n */\nexport interface RoutePathMatch {\n params: RouteParams;\n methods: HttpMethod[];\n route: RouteEntry;\n}\n\n/**\n * Method-aware router used by the built-in server.\n */\nexport interface Router {\n readonly routes: RouteTable;\n match(method: HttpMethod, path: string): RouteMatch | null;\n matchPath(path: string): RoutePathMatch | null;\n}\n\n/**\n * Defines one typed route entry.\n */\nexport const defineRoute = <const P extends string>(route: RouteEntry<P>): RouteEntry<P> => route;\n\n/**\n * Matches a URL path against a route pattern.\n */\nexport const matchRoutePath = (pattern: string, path: string): RouteParams | null => {\n const routeParts = pattern.split(\"/\").filter(Boolean);\n const pathParts = path.split(\"/\").filter(Boolean);\n if (routeParts.length !== pathParts.length) {\n return null;\n }\n\n const params: RouteParams = {};\n for (let index = 0; index < routeParts.length; index += 1) {\n const expected = routeParts[index];\n const actual = pathParts[index];\n if (expected === undefined || actual === undefined) {\n return null;\n }\n\n if (expected.startsWith(\":\")) {\n params[expected.slice(1)] = actual;\n continue;\n }\n\n if (expected !== actual) {\n return null;\n }\n }\n\n return params;\n};\n\n/**\n * Creates a simple method-aware router from a route table.\n */\nexport const createRouter = (routes: RouteTable): Router => ({\n routes,\n match(method, path) {\n for (const route of routes) {\n if (route.method !== method) {\n continue;\n }\n\n const params = matchRoutePath(route.pattern, path);\n if (params) {\n return { route, params };\n }\n }\n\n return null;\n },\n matchPath(path) {\n const methods: HttpMethod[] = [];\n let firstMatch: { route: RouteEntry; params: RouteParams } | null = null;\n\n for (const route of routes) {\n const params = matchRoutePath(route.pattern, path);\n if (!params) {\n continue;\n }\n\n methods.push(route.method);\n if (!firstMatch) {\n firstMatch = { route, params };\n }\n }\n\n return firstMatch ? { ...firstMatch, methods } : null;\n },\n});\n\ntype ExtractParamKeys<Path extends string> = Path extends `${string}:${infer Param}/${infer Rest}`\n ? Param | ExtractParamKeys<`/${Rest}`>\n : Path extends `${string}:${infer Param}`\n ? Param\n : never;\n\ntype ParamsFromPath<Path extends string> = {\n [K in ExtractParamKeys<Path>]: string;\n};\n"],"mappings":";;;;AAgEA,MAAa,eAAuC,UAAwC;;;;AAK5F,MAAa,kBAAkB,SAAiB,SAAqC;CACjF,MAAM,aAAa,QAAQ,MAAM,IAAI,CAAC,OAAO,QAAQ;CACrD,MAAM,YAAY,KAAK,MAAM,IAAI,CAAC,OAAO,QAAQ;AACjD,KAAI,WAAW,WAAW,UAAU,OAChC,QAAO;CAGX,MAAM,SAAsB,EAAE;AAC9B,MAAK,IAAI,QAAQ,GAAG,QAAQ,WAAW,QAAQ,SAAS,GAAG;EACvD,MAAM,WAAW,WAAW;EAC5B,MAAM,SAAS,UAAU;AACzB,MAAI,aAAa,UAAa,WAAW,OACrC,QAAO;AAGX,MAAI,SAAS,WAAW,IAAI,EAAE;AAC1B,UAAO,SAAS,MAAM,EAAE,IAAI;AAC5B;;AAGJ,MAAI,aAAa,OACb,QAAO;;AAIf,QAAO;;;;;AAMX,MAAa,gBAAgB,YAAgC;CACzD;CACA,MAAM,QAAQ,MAAM;AAChB,OAAK,MAAM,SAAS,QAAQ;AACxB,OAAI,MAAM,WAAW,OACjB;GAGJ,MAAM,SAAS,eAAe,MAAM,SAAS,KAAK;AAClD,OAAI,OACA,QAAO;IAAE;IAAO;IAAQ;;AAIhC,SAAO;;CAEX,UAAU,MAAM;EACZ,MAAM,UAAwB,EAAE;EAChC,IAAI,aAAgE;AAEpE,OAAK,MAAM,SAAS,QAAQ;GACxB,MAAM,SAAS,eAAe,MAAM,SAAS,KAAK;AAClD,OAAI,CAAC,OACD;AAGJ,WAAQ,KAAK,MAAM,OAAO;AAC1B,OAAI,CAAC,WACD,cAAa;IAAE;IAAO;IAAQ;;AAItC,SAAO,aAAa;GAAE,GAAG;GAAY;GAAS,GAAG;;CAExD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BetterAgentError } from "@better-agent/shared/errors";
|
|
2
|
+
|
|
3
|
+
//#region src/app/config.ts
|
|
4
|
+
/**
|
|
5
|
+
* Validates app configuration.
|
|
6
|
+
*/
|
|
7
|
+
function validateConfig(config) {
|
|
8
|
+
const validateOptionalPositiveNumber = (value, field) => {
|
|
9
|
+
if (value !== void 0 && (!Number.isFinite(value) || value <= 0)) throw BetterAgentError.fromCode("VALIDATION_FAILED", `${field} must be a positive number.`, {
|
|
10
|
+
context: { [field]: value },
|
|
11
|
+
trace: [{ at: "core.app.validateConfig" }]
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
if (!config.agents || config.agents.length === 0) throw BetterAgentError.fromCode("VALIDATION_FAILED", "App configuration must include at least one agent.", { trace: [{ at: "core.app.validateConfig" }] });
|
|
15
|
+
for (const agent of config.agents) if (typeof agent.name !== "string" || agent.name.length === 0) throw BetterAgentError.fromCode("VALIDATION_FAILED", "All agents must have a name.", { trace: [{ at: "core.app.validateConfig" }] });
|
|
16
|
+
const seenNames = /* @__PURE__ */ new Set();
|
|
17
|
+
for (const agent of config.agents) {
|
|
18
|
+
if (seenNames.has(agent.name)) throw BetterAgentError.fromCode("VALIDATION_FAILED", `Duplicate agent name '${agent.name}'.`, {
|
|
19
|
+
context: { agentName: agent.name },
|
|
20
|
+
trace: [{ at: "core.app.validateConfig" }]
|
|
21
|
+
});
|
|
22
|
+
seenNames.add(agent.name);
|
|
23
|
+
}
|
|
24
|
+
if (config.plugins) {
|
|
25
|
+
const seenPluginIds = /* @__PURE__ */ new Set();
|
|
26
|
+
for (const plugin of config.plugins) {
|
|
27
|
+
if (seenPluginIds.has(plugin.id)) throw BetterAgentError.fromCode("VALIDATION_FAILED", `Duplicate plugin id '${plugin.id}' in app config.`, {
|
|
28
|
+
context: { pluginId: plugin.id },
|
|
29
|
+
trace: [{ at: "core.app.validateConfig" }]
|
|
30
|
+
});
|
|
31
|
+
seenPluginIds.add(plugin.id);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
validateOptionalPositiveNumber(config.advanced?.clientToolResultTimeoutMs, "advanced.clientToolResultTimeoutMs");
|
|
35
|
+
validateOptionalPositiveNumber(config.advanced?.toolApprovalTimeoutMs, "advanced.toolApprovalTimeoutMs");
|
|
36
|
+
validateOptionalPositiveNumber(config.advanced?.sseHeartbeatMs, "advanced.sseHeartbeatMs");
|
|
37
|
+
if (config.advanced?.onRequestDisconnect === "continue" && !config.persistence?.stream) throw BetterAgentError.fromCode("VALIDATION_FAILED", "advanced.onRequestDisconnect='continue' requires persistence.stream to be configured.", { trace: [{ at: "core.app.validateConfig" }] });
|
|
38
|
+
return config;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
//#endregion
|
|
42
|
+
export { validateConfig };
|
|
43
|
+
//# sourceMappingURL=config.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.mjs","names":[],"sources":["../../src/app/config.ts"],"sourcesContent":["import { BetterAgentError } from \"@better-agent/shared/errors\";\nimport type { AnyBetterAgentConfig } from \"./types\";\n\n/**\n * Validates app configuration.\n */\nexport function validateConfig<const TConfig extends AnyBetterAgentConfig>(\n config: TConfig,\n): TConfig {\n const validateOptionalPositiveNumber = (value: number | undefined, field: string) => {\n if (value !== undefined && (!Number.isFinite(value) || value <= 0)) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n `${field} must be a positive number.`,\n {\n context: { [field]: value },\n trace: [{ at: \"core.app.validateConfig\" }],\n },\n );\n }\n };\n\n // Validate required agents field\n if (!config.agents || config.agents.length === 0) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n \"App configuration must include at least one agent.\",\n {\n trace: [{ at: \"core.app.validateConfig\" }],\n },\n );\n }\n\n // Validate app-level agent defaults that only make sense in app assembly.\n for (const agent of config.agents) {\n if (typeof agent.name !== \"string\" || agent.name.length === 0) {\n throw BetterAgentError.fromCode(\"VALIDATION_FAILED\", \"All agents must have a name.\", {\n trace: [{ at: \"core.app.validateConfig\" }],\n });\n }\n }\n\n // Validate unique agent names\n const seenNames = new Set<string>();\n for (const agent of config.agents) {\n if (seenNames.has(agent.name)) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n `Duplicate agent name '${agent.name}'.`,\n {\n context: { agentName: agent.name },\n trace: [{ at: \"core.app.validateConfig\" }],\n },\n );\n }\n seenNames.add(agent.name);\n }\n\n // Validate unique plugin ids\n if (config.plugins) {\n const seenPluginIds = new Set<string>();\n for (const plugin of config.plugins) {\n if (seenPluginIds.has(plugin.id)) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n `Duplicate plugin id '${plugin.id}' in app config.`,\n {\n context: { pluginId: plugin.id },\n trace: [{ at: \"core.app.validateConfig\" }],\n },\n );\n }\n seenPluginIds.add(plugin.id);\n }\n }\n\n // Normalize optional fields\n validateOptionalPositiveNumber(\n config.advanced?.clientToolResultTimeoutMs,\n \"advanced.clientToolResultTimeoutMs\",\n );\n validateOptionalPositiveNumber(\n config.advanced?.toolApprovalTimeoutMs,\n \"advanced.toolApprovalTimeoutMs\",\n );\n validateOptionalPositiveNumber(config.advanced?.sseHeartbeatMs, \"advanced.sseHeartbeatMs\");\n\n if (config.advanced?.onRequestDisconnect === \"continue\" && !config.persistence?.stream) {\n throw BetterAgentError.fromCode(\n \"VALIDATION_FAILED\",\n \"advanced.onRequestDisconnect='continue' requires persistence.stream to be configured.\",\n {\n trace: [{ at: \"core.app.validateConfig\" }],\n },\n );\n }\n\n return config;\n}\n"],"mappings":";;;;;;AAMA,SAAgB,eACZ,QACO;CACP,MAAM,kCAAkC,OAA2B,UAAkB;AACjF,MAAI,UAAU,WAAc,CAAC,OAAO,SAAS,MAAM,IAAI,SAAS,GAC5D,OAAM,iBAAiB,SACnB,qBACA,GAAG,MAAM,8BACT;GACI,SAAS,GAAG,QAAQ,OAAO;GAC3B,OAAO,CAAC,EAAE,IAAI,2BAA2B,CAAC;GAC7C,CACJ;;AAKT,KAAI,CAAC,OAAO,UAAU,OAAO,OAAO,WAAW,EAC3C,OAAM,iBAAiB,SACnB,qBACA,sDACA,EACI,OAAO,CAAC,EAAE,IAAI,2BAA2B,CAAC,EAC7C,CACJ;AAIL,MAAK,MAAM,SAAS,OAAO,OACvB,KAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,WAAW,EACxD,OAAM,iBAAiB,SAAS,qBAAqB,gCAAgC,EACjF,OAAO,CAAC,EAAE,IAAI,2BAA2B,CAAC,EAC7C,CAAC;CAKV,MAAM,4BAAY,IAAI,KAAa;AACnC,MAAK,MAAM,SAAS,OAAO,QAAQ;AAC/B,MAAI,UAAU,IAAI,MAAM,KAAK,CACzB,OAAM,iBAAiB,SACnB,qBACA,yBAAyB,MAAM,KAAK,KACpC;GACI,SAAS,EAAE,WAAW,MAAM,MAAM;GAClC,OAAO,CAAC,EAAE,IAAI,2BAA2B,CAAC;GAC7C,CACJ;AAEL,YAAU,IAAI,MAAM,KAAK;;AAI7B,KAAI,OAAO,SAAS;EAChB,MAAM,gCAAgB,IAAI,KAAa;AACvC,OAAK,MAAM,UAAU,OAAO,SAAS;AACjC,OAAI,cAAc,IAAI,OAAO,GAAG,CAC5B,OAAM,iBAAiB,SACnB,qBACA,wBAAwB,OAAO,GAAG,mBAClC;IACI,SAAS,EAAE,UAAU,OAAO,IAAI;IAChC,OAAO,CAAC,EAAE,IAAI,2BAA2B,CAAC;IAC7C,CACJ;AAEL,iBAAc,IAAI,OAAO,GAAG;;;AAKpC,gCACI,OAAO,UAAU,2BACjB,qCACH;AACD,gCACI,OAAO,UAAU,uBACjB,iCACH;AACD,gCAA+B,OAAO,UAAU,gBAAgB,0BAA0B;AAE1F,KAAI,OAAO,UAAU,wBAAwB,cAAc,CAAC,OAAO,aAAa,OAC5E,OAAM,iBAAiB,SACnB,qBACA,yFACA,EACI,OAAO,CAAC,EAAE,IAAI,2BAA2B,CAAC,EAC7C,CACJ;AAGL,QAAO"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { AgentToolDefinition } from "../tools/types.mjs";
|
|
2
|
+
import { AnyAgentDefinition } from "../agent/types.mjs";
|
|
3
|
+
import { Plugin } from "../plugins/types.mjs";
|
|
4
|
+
import { BetterAgentApp, BetterAgentConfig, BetterAgentHandler } from "./types.mjs";
|
|
5
|
+
|
|
6
|
+
//#region src/app/create-app.d.ts
|
|
7
|
+
/**
|
|
8
|
+
* Creates a Better Agent app.
|
|
9
|
+
*
|
|
10
|
+
* Register agents, shared tools, plugins, and optional advanced settings.
|
|
11
|
+
*
|
|
12
|
+
* @param config App configuration.
|
|
13
|
+
* @returns An app with `run`, `stream`, and `handler`.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* const app = betterAgent({
|
|
18
|
+
* agents: [supportAgent],
|
|
19
|
+
* secret: "dev-secret",
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* const result = await app.run("support", {
|
|
23
|
+
* input: "Hello!",
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
declare function betterAgent<const TAgents extends readonly AnyAgentDefinition[], const TPlugins extends readonly Plugin[] = readonly Plugin[], const TTools extends readonly AgentToolDefinition[] = readonly AgentToolDefinition[]>(config: BetterAgentConfig<TAgents, TPlugins, TTools>): BetterAgentApp<TAgents, TPlugins> & {
|
|
28
|
+
handler: BetterAgentHandler;
|
|
29
|
+
readonly __appTypes?: {
|
|
30
|
+
readonly agents: TAgents;
|
|
31
|
+
readonly tools: TTools;
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
//#endregion
|
|
35
|
+
export { betterAgent };
|
|
36
|
+
//# sourceMappingURL=create-app.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-app.d.mts","names":[],"sources":["../../src/app/create-app.ts"],"mappings":";;;;;;;;;;;AAgCA;;;;;;;;;;;;;;;iBAAgB,WAAA,gCACmB,kBAAA,oCACC,MAAA,cAAoB,MAAA,kCACtB,mBAAA,cAAiC,mBAAA,GAAA,CAE/D,MAAA,EAAQ,iBAAA,CAAkB,OAAA,EAAS,QAAA,EAAU,MAAA,IAC9C,cAAA,CAAe,OAAA,EAAS,QAAA;EACvB,OAAA,EAAS,kBAAA;EAAA,SACA,UAAA;IAAA,SACI,MAAA,EAAQ,OAAA;IAAA,SACR,KAAA,EAAO,MAAA;EAAA;AAAA"}
|