@theokit/agents 0.44.2 → 0.44.4

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.
@@ -587,8 +587,17 @@ interface DefineAgentConfig<TInput extends z.ZodType = z.ZodType> {
587
587
  * + execution (G2 / ADR-0040); theokit only wires this into `Agent.create({ local.settingSources })`.
588
588
  */
589
589
  settingSources?: readonly SettingSource[];
590
- /** Code `Plugin` objects forwarded to `Agent.create({ plugins })` (lifecycle-hook seam). */
590
+ /**
591
+ * Code `Plugin` objects forwarded to `Agent.create({ plugins })` — EXTENSION units (tools,
592
+ * commands, model providers, memory adapters). For lifecycle interception use {@link hooks}.
593
+ */
591
594
  plugins?: readonly unknown[];
595
+ /**
596
+ * Lifecycle hooks keyed by `HookName` (`pre_tool_call` may veto via `{ block, message }`). Set by
597
+ * the builder's `hooks()`; converted into a code plugin at `build()` and never reaching the SDK
598
+ * under this name — the plugin is the TRANSPORT, this is the contract callers write against.
599
+ */
600
+ hooks?: Readonly<Record<string, unknown>>;
592
601
  /**
593
602
  * MCP servers available to the agent — the builder-chain equivalent of the `@MCP` class
594
603
  * decorator. Each key is a server name; the value is the server configuration. Forwarded
@@ -931,12 +940,32 @@ interface AgentBuilder<TInput extends z.ZodType | UnsetMarker = UnsetMarker, TMo
931
940
  * shell-executing hooks from `.theokit/hooks.json` — opt-in because `.theokit/` is your own repo.
932
941
  */
933
942
  settingSources(sources: readonly SettingSource[]): AgentBuilder<TInput, TModel, TContext, TTools>;
943
+ /**
944
+ * Attach LIFECYCLE HOOKS in code, keyed by `HookName` — the builder-chain seam for intercepting
945
+ * the agent loop. `pre_tool_call` may VETO a tool by returning `{ block: true, message }` before
946
+ * it runs; the other events are observational.
947
+ *
948
+ * ```ts
949
+ * agent().hooks({
950
+ * pre_tool_call: (c) => guard(c.name) ? undefined : { block: true, message: 'not allowed' },
951
+ * on_session_start: () => log('session up'),
952
+ * })
953
+ * ```
954
+ *
955
+ * A hook is delivered internally as a code plugin, but that is TRANSPORT, not the contract — use
956
+ * this instead of hand-wrapping a plugin, so the caller expresses interception rather than
957
+ * assembling plumbing. Call once — a later call replaces the map. Composes with
958
+ * {@link AgentBuilder.plugins}: hooks and plugins are additive, not exclusive.
959
+ */
960
+ hooks(map: Readonly<Record<string, unknown>>): AgentBuilder<TInput, TModel, TContext, TTools>;
934
961
  /**
935
962
  * Register code `Plugin` objects for this agent — the builder-chain equivalent of
936
- * `Agent.create({ plugins })`. This is how a fluent-built agent gets LIFECYCLE HOOKS in code:
937
- * `plugins([createToolHooksPlugin({ beforeToolCall, afterToolCall })])` lets `beforeToolCall`
938
- * VETO a tool call (`{ block, message }`) before it runs. Without this the fluent builder had no
939
- * way to reach the SDK's plugin seam (file-based `.theokit/hooks.json` is the other path).
963
+ * `Agent.create({ plugins })`. A plugin is an EXTENSION UNIT: it can register tools and commands,
964
+ * or supply a model provider / memory adapter (`kind: 'general' | 'model-provider' | 'memory'`).
965
+ *
966
+ * For lifecycle interception prefer {@link AgentBuilder.hooks} a hook needs a plugin only as its
967
+ * transport, and `plugins()` makes the caller assemble that transport by hand. Reach for this when
968
+ * you genuinely have a plugin (a provider, a memory adapter, a tool-registering extension).
940
969
  */
941
970
  plugins(list: readonly unknown[]): AgentBuilder<TInput, TModel, TContext, TTools>;
942
971
  /**
package/dist/bridge.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { c as AGENT_BRAND, d as AfterToolCallContext, e as AgentBuilder, f as AgentDefinition, g as AgentDefinitionError, h as AgentExecutionContext, i as AgentManifest, A as AgentManifestEntry, j as AgentManifestTool, k as AgentRoute, l as AgentRouteContext, m as AgentRunInfo, n as AgentStreamEvent, o as AgentTurnMetadata, p as AgentWalkResult, q as AgentWarningCode, r as AgentsPluginOptions, s as ApiErrorContext, t as ApiErrorDecision, u as ApiErrorPolicy, v as ApprovalRequiredEvent, w as ArtifactChunkEvent, x as ArtifactStartEvent, B as BackgroundDelegation, y as BeforeToolCallContext, z as BudgetExceededError, E as CheckpointSavedEvent, C as CompiledAgentOptions, F as CompiledContextWindow, a as CompiledTool, G as ContextualTool, I as DefineAgentConfig, J as DelegateFn, K as DelegateOptions, M as DelegationError, D as DelegationResult, N as DoneEvent, O as ErrorEvent, P as FileEditEvent, T as InferAgentInput, U as InferAgentToolNames, V as IterationEvent, W as LLMCallContext, _ as McpApprovalSpec, $ as McpRegistryConfig, a0 as McpRequestContext, a1 as McpSelection, a2 as PartialToolCallEvent, a3 as ProcessInputContext, a7 as RunStartedEvent, a8 as ScoreVerdict, a9 as ScoredDelegation, aa as Scorer, ab as SdkAgentHandle, ac as SdkMessage, ad as Segment, ag as StateUpdateEvent, S as StreamEvent, ah as TextDeltaEvent, ai as ThinkingEvent, aj as ToolCallEvent, ak as ToolCallVeto, al as ToolHooks, am as ToolHooksPlugin, an as ToolResultEvent, ao as ToolWalkResult, ap as ToolboxWalkResult, aq as agent, ar as agentsPlugin, as as buildModelSelection, at as compileAgent, au as compileAgentDefinition, av as compileAgentModule, aw as compileContextWindow, ax as compileProjectContext, ay as compileSkills, az as compileTools, aA as contextualTool, aB as createAgentExecutionContext, aC as createApiErrorHandler, aD as createSdkAgentStream, aE as createThinkTagExtractor, aF as createToolHooksPlugin, aG as delegate, aH as delegateBackground, aI as delegateWithScoring, aJ as extractThinkTagStream, aK as generateAgentManifest, aL as generateAgentRoutes, aM as isAgentContext, aN as isAgentDefinition, aO as isApprovalRequired, aP as isDone, aQ as isError, aR as isPartialToolCall, aS as isTextDelta, aT as isToolCall, aU as isToolResult, aX as mcpRegistry, aY as mcpToolApprovals, a_ as projectContextMetadataOnlyKnobs, b2 as resolveMcpServers, b3 as runWithApiErrorHandling, b4 as streamAgentResponse, b5 as streamAgentUIMessages, b6 as toAgentFactory, b7 as translateSdkEvent, b8 as translateToUIMessageStream, b9 as validateUniqueRoutes, ba as walkAgentMetadata } from './bridge-entry-DQJMvdRy.js';
1
+ export { c as AGENT_BRAND, d as AfterToolCallContext, e as AgentBuilder, f as AgentDefinition, g as AgentDefinitionError, h as AgentExecutionContext, i as AgentManifest, A as AgentManifestEntry, j as AgentManifestTool, k as AgentRoute, l as AgentRouteContext, m as AgentRunInfo, n as AgentStreamEvent, o as AgentTurnMetadata, p as AgentWalkResult, q as AgentWarningCode, r as AgentsPluginOptions, s as ApiErrorContext, t as ApiErrorDecision, u as ApiErrorPolicy, v as ApprovalRequiredEvent, w as ArtifactChunkEvent, x as ArtifactStartEvent, B as BackgroundDelegation, y as BeforeToolCallContext, z as BudgetExceededError, E as CheckpointSavedEvent, C as CompiledAgentOptions, F as CompiledContextWindow, a as CompiledTool, G as ContextualTool, I as DefineAgentConfig, J as DelegateFn, K as DelegateOptions, M as DelegationError, D as DelegationResult, N as DoneEvent, O as ErrorEvent, P as FileEditEvent, T as InferAgentInput, U as InferAgentToolNames, V as IterationEvent, W as LLMCallContext, _ as McpApprovalSpec, $ as McpRegistryConfig, a0 as McpRequestContext, a1 as McpSelection, a2 as PartialToolCallEvent, a3 as ProcessInputContext, a7 as RunStartedEvent, a8 as ScoreVerdict, a9 as ScoredDelegation, aa as Scorer, ab as SdkAgentHandle, ac as SdkMessage, ad as Segment, ag as StateUpdateEvent, S as StreamEvent, ah as TextDeltaEvent, ai as ThinkingEvent, aj as ToolCallEvent, ak as ToolCallVeto, al as ToolHooks, am as ToolHooksPlugin, an as ToolResultEvent, ao as ToolWalkResult, ap as ToolboxWalkResult, aq as agent, ar as agentsPlugin, as as buildModelSelection, at as compileAgent, au as compileAgentDefinition, av as compileAgentModule, aw as compileContextWindow, ax as compileProjectContext, ay as compileSkills, az as compileTools, aA as contextualTool, aB as createAgentExecutionContext, aC as createApiErrorHandler, aD as createSdkAgentStream, aE as createThinkTagExtractor, aF as createToolHooksPlugin, aG as delegate, aH as delegateBackground, aI as delegateWithScoring, aJ as extractThinkTagStream, aK as generateAgentManifest, aL as generateAgentRoutes, aM as isAgentContext, aN as isAgentDefinition, aO as isApprovalRequired, aP as isDone, aQ as isError, aR as isPartialToolCall, aS as isTextDelta, aT as isToolCall, aU as isToolResult, aX as mcpRegistry, aY as mcpToolApprovals, a_ as projectContextMetadataOnlyKnobs, b2 as resolveMcpServers, b3 as runWithApiErrorHandling, b4 as streamAgentResponse, b5 as streamAgentUIMessages, b6 as toAgentFactory, b7 as translateSdkEvent, b8 as translateToUIMessageStream, b9 as validateUniqueRoutes, ba as walkAgentMetadata } from './bridge-entry-BtFJdaCe.js';
2
2
  import '@theokit/http';
3
3
  import './types-DVA4LQsA.js';
4
4
  import '@theokit/sdk';
package/dist/bridge.js CHANGED
@@ -47,7 +47,7 @@ import {
47
47
  translateToUIMessageStream,
48
48
  validateUniqueRoutes,
49
49
  walkAgentMetadata
50
- } from "./chunk-XRPFOFYF.js";
50
+ } from "./chunk-TFGN3AJV.js";
51
51
  import "./chunk-NERDIS45.js";
52
52
  import "./chunk-7QVYU63E.js";
53
53
  export {
@@ -562,9 +562,10 @@ function compileAgentDefinition(def) {
562
562
  ...def.settingSources !== void 0 ? {
563
563
  settingSources: def.settingSources
564
564
  } : {},
565
- ...def.plugins !== void 0 ? {
566
- plugins: def.plugins
567
- } : {},
565
+ // Hooks are converted here — the layer EVERY path converges on — rather than on the builder, so
566
+ // `defineAgent({ hooks })` cannot type-check and silently no-op. A lifecycle hook that is
567
+ // declared but never registered is a security gate that does not gate.
568
+ ...compileHooksAndPlugins(def),
568
569
  // MCP — builder/`defineAgent` servers converge on the same `mcpServers` field the `@MCP`
569
570
  // decorator path populates; the SDK adapter forwards it to `Agent.create({ mcpServers })`.
570
571
  ...def.mcpServers !== void 0 ? {
@@ -573,6 +574,33 @@ function compileAgentDefinition(def) {
573
574
  };
574
575
  }
575
576
  __name(compileAgentDefinition, "compileAgentDefinition");
577
+ function compileHooksAndPlugins(def) {
578
+ const map = def.hooks;
579
+ const entries = Object.entries(map ?? {}).filter(([, h]) => typeof h === "function");
580
+ const explicit = def.plugins ?? [];
581
+ if (entries.length === 0) {
582
+ return def.plugins !== void 0 ? {
583
+ plugins: def.plugins
584
+ } : {};
585
+ }
586
+ const plugin = {
587
+ name: "theokit-builder-hooks",
588
+ version: "1.0.0",
589
+ kind: "general",
590
+ register(ctx) {
591
+ for (const [hookName, handler] of entries) {
592
+ ctx.on(hookName, handler);
593
+ }
594
+ }
595
+ };
596
+ return {
597
+ plugins: [
598
+ ...explicit,
599
+ plugin
600
+ ]
601
+ };
602
+ }
603
+ __name(compileHooksAndPlugins, "compileHooksAndPlugins");
576
604
  function compileSkillsSelection(skills) {
577
605
  if (skills === void 0) return {};
578
606
  if (typeof skills === "function") return {
@@ -1701,6 +1729,10 @@ function makeBuilder(config) {
1701
1729
  ...config,
1702
1730
  settingSources: sources
1703
1731
  }), "settingSources"),
1732
+ hooks: /* @__PURE__ */ __name((map) => makeBuilder({
1733
+ ...config,
1734
+ hooks: map
1735
+ }), "hooks"),
1704
1736
  plugins: /* @__PURE__ */ __name((list) => makeBuilder({
1705
1737
  ...config,
1706
1738
  plugins: list
@@ -3085,4 +3117,4 @@ export {
3085
3117
  generateAgentManifest,
3086
3118
  agentsPlugin
3087
3119
  };
3088
- //# sourceMappingURL=chunk-XRPFOFYF.js.map
3120
+ //# sourceMappingURL=chunk-TFGN3AJV.js.map