@haikeilabs/agentware 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 (125) hide show
  1. package/README.md +45 -0
  2. package/dist/evals/cases/file_search.d.ts +4 -0
  3. package/dist/evals/cases/file_search.d.ts.map +1 -0
  4. package/dist/evals/cases/file_search.js +99 -0
  5. package/dist/evals/cases/general.d.ts +4 -0
  6. package/dist/evals/cases/general.d.ts.map +1 -0
  7. package/dist/evals/cases/general.js +113 -0
  8. package/dist/evals/index.d.ts +5 -0
  9. package/dist/evals/index.d.ts.map +1 -0
  10. package/dist/evals/index.js +4 -0
  11. package/dist/evals/main.d.ts +2 -0
  12. package/dist/evals/main.d.ts.map +1 -0
  13. package/dist/evals/main.js +109 -0
  14. package/dist/evals/models.d.ts +38 -0
  15. package/dist/evals/models.d.ts.map +1 -0
  16. package/dist/evals/models.js +69 -0
  17. package/dist/evals/runner.d.ts +40 -0
  18. package/dist/evals/runner.d.ts.map +1 -0
  19. package/dist/evals/runner.js +131 -0
  20. package/dist/executor/executor.d.ts +42 -0
  21. package/dist/executor/executor.d.ts.map +1 -0
  22. package/dist/executor/executor.js +63 -0
  23. package/dist/executor/index.d.ts +2 -0
  24. package/dist/executor/index.d.ts.map +1 -0
  25. package/dist/executor/index.js +1 -0
  26. package/dist/index.d.ts +10 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +9 -0
  29. package/dist/jobs/index.d.ts +3 -0
  30. package/dist/jobs/index.d.ts.map +1 -0
  31. package/dist/jobs/index.js +2 -0
  32. package/dist/jobs/job.d.ts +18 -0
  33. package/dist/jobs/job.d.ts.map +1 -0
  34. package/dist/jobs/job.js +20 -0
  35. package/dist/jobs/manager.d.ts +23 -0
  36. package/dist/jobs/manager.d.ts.map +1 -0
  37. package/dist/jobs/manager.js +63 -0
  38. package/dist/llm/backend.d.ts +9 -0
  39. package/dist/llm/backend.d.ts.map +1 -0
  40. package/dist/llm/backend.js +1 -0
  41. package/dist/llm/index.d.ts +4 -0
  42. package/dist/llm/index.d.ts.map +1 -0
  43. package/dist/llm/index.js +1 -0
  44. package/dist/llm/request.d.ts +28 -0
  45. package/dist/llm/request.d.ts.map +1 -0
  46. package/dist/llm/request.js +7 -0
  47. package/dist/llm/response.d.ts +17 -0
  48. package/dist/llm/response.d.ts.map +1 -0
  49. package/dist/llm/response.js +1 -0
  50. package/dist/llmcontext/context_window.d.ts +36 -0
  51. package/dist/llmcontext/context_window.d.ts.map +1 -0
  52. package/dist/llmcontext/context_window.js +115 -0
  53. package/dist/llmcontext/index.d.ts +4 -0
  54. package/dist/llmcontext/index.d.ts.map +1 -0
  55. package/dist/llmcontext/index.js +3 -0
  56. package/dist/llmcontext/manager.d.ts +27 -0
  57. package/dist/llmcontext/manager.d.ts.map +1 -0
  58. package/dist/llmcontext/manager.js +27 -0
  59. package/dist/llmcontext/strategies.d.ts +21 -0
  60. package/dist/llmcontext/strategies.d.ts.map +1 -0
  61. package/dist/llmcontext/strategies.js +180 -0
  62. package/dist/memory/client.d.ts +107 -0
  63. package/dist/memory/client.d.ts.map +1 -0
  64. package/dist/memory/client.js +210 -0
  65. package/dist/memory/index.d.ts +5 -0
  66. package/dist/memory/index.d.ts.map +1 -0
  67. package/dist/memory/index.js +2 -0
  68. package/dist/memory/tools.d.ts +22 -0
  69. package/dist/memory/tools.d.ts.map +1 -0
  70. package/dist/memory/tools.js +57 -0
  71. package/dist/middleware/audit.d.ts +27 -0
  72. package/dist/middleware/audit.d.ts.map +1 -0
  73. package/dist/middleware/audit.js +26 -0
  74. package/dist/middleware/guardrails/error_tracker.d.ts +34 -0
  75. package/dist/middleware/guardrails/error_tracker.d.ts.map +1 -0
  76. package/dist/middleware/guardrails/error_tracker.js +70 -0
  77. package/dist/middleware/guardrails/nudge.d.ts +17 -0
  78. package/dist/middleware/guardrails/nudge.d.ts.map +1 -0
  79. package/dist/middleware/guardrails/nudge.js +67 -0
  80. package/dist/middleware/guardrails/response_validator.d.ts +29 -0
  81. package/dist/middleware/guardrails/response_validator.d.ts.map +1 -0
  82. package/dist/middleware/guardrails/response_validator.js +145 -0
  83. package/dist/middleware/guardrails/step_enforcer.d.ts +20 -0
  84. package/dist/middleware/guardrails/step_enforcer.d.ts.map +1 -0
  85. package/dist/middleware/guardrails/step_enforcer.js +65 -0
  86. package/dist/middleware/index.d.ts +5 -0
  87. package/dist/middleware/index.d.ts.map +1 -0
  88. package/dist/middleware/index.js +4 -0
  89. package/dist/middleware/inference.d.ts +28 -0
  90. package/dist/middleware/inference.d.ts.map +1 -0
  91. package/dist/middleware/inference.js +141 -0
  92. package/dist/middleware/middleware.d.ts +22 -0
  93. package/dist/middleware/middleware.d.ts.map +1 -0
  94. package/dist/middleware/middleware.js +51 -0
  95. package/dist/middleware/policy.d.ts +46 -0
  96. package/dist/middleware/policy.d.ts.map +1 -0
  97. package/dist/middleware/policy.js +122 -0
  98. package/dist/middleware/types.d.ts +42 -0
  99. package/dist/middleware/types.d.ts.map +1 -0
  100. package/dist/middleware/types.js +36 -0
  101. package/dist/prompts/generator.d.ts +10 -0
  102. package/dist/prompts/generator.d.ts.map +1 -0
  103. package/dist/prompts/generator.js +24 -0
  104. package/dist/prompts/index.d.ts +2 -0
  105. package/dist/prompts/index.d.ts.map +1 -0
  106. package/dist/prompts/index.js +1 -0
  107. package/dist/toolformat/formatter.d.ts +20 -0
  108. package/dist/toolformat/formatter.d.ts.map +1 -0
  109. package/dist/toolformat/formatter.js +22 -0
  110. package/dist/toolformat/index.d.ts +2 -0
  111. package/dist/toolformat/index.d.ts.map +1 -0
  112. package/dist/toolformat/index.js +1 -0
  113. package/dist/tools/async.d.ts +42 -0
  114. package/dist/tools/async.d.ts.map +1 -0
  115. package/dist/tools/async.js +89 -0
  116. package/dist/tools/index.d.ts +5 -0
  117. package/dist/tools/index.d.ts.map +1 -0
  118. package/dist/tools/index.js +3 -0
  119. package/dist/tools/registry.d.ts +11 -0
  120. package/dist/tools/registry.d.ts.map +1 -0
  121. package/dist/tools/registry.js +27 -0
  122. package/dist/tools/tool.d.ts +29 -0
  123. package/dist/tools/tool.d.ts.map +1 -0
  124. package/dist/tools/tool.js +31 -0
  125. package/package.json +49 -0
@@ -0,0 +1,42 @@
1
+ export declare enum MessageType {
2
+ SYSTEM_PROMPT = "system_prompt",
3
+ USER_INPUT = "user_input",
4
+ TOOL_CALL = "tool_call",
5
+ TOOL_RESULT = "tool_result",
6
+ REASONING = "reasoning",
7
+ TEXT_RESPONSE = "text_response",
8
+ STEP_NUDGE = "step_nudge",
9
+ PREREQUISITE_NUDGE = "prerequisite_nudge",
10
+ RETRY_NUDGE = "retry_nudge",
11
+ CONTEXT_WARNING = "context_warning",
12
+ SUMMARY = "summary"
13
+ }
14
+ export interface MessageMeta {
15
+ type: MessageType;
16
+ step_index?: number;
17
+ original_type?: MessageType;
18
+ token_estimate?: number;
19
+ }
20
+ export declare enum Action {
21
+ ALLOW = "allow",
22
+ DENY = "deny",
23
+ FILTER = "filter"
24
+ }
25
+ export interface CallerContext {
26
+ user_id?: string;
27
+ session_id?: string;
28
+ role?: string;
29
+ source?: string;
30
+ trusted: boolean;
31
+ metadata?: Record<string, string>;
32
+ }
33
+ export interface Decision {
34
+ action: Action;
35
+ rule: string;
36
+ reason: string;
37
+ redacted_args?: Record<string, unknown>;
38
+ timestamp: Date;
39
+ }
40
+ export declare function createAllowDecision(reason?: string): Decision;
41
+ export declare function createDenyDecision(reason: string): Decision;
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/middleware/types.ts"],"names":[],"mappings":"AAAA,oBAAY,WAAW;IACrB,aAAa,kBAAkB;IAC/B,UAAU,eAAe;IACzB,SAAS,cAAc;IACvB,WAAW,gBAAgB;IAC3B,SAAS,cAAc;IACvB,aAAa,kBAAkB;IAC/B,UAAU,eAAe;IACzB,kBAAkB,uBAAuB;IACzC,WAAW,gBAAgB;IAC3B,eAAe,oBAAoB;IACnC,OAAO,YAAY;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,oBAAY,MAAM;IAChB,KAAK,UAAU;IACf,IAAI,SAAS;IACb,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,SAAY,GAAG,QAAQ,CAOhE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,CAO3D"}
@@ -0,0 +1,36 @@
1
+ export var MessageType;
2
+ (function (MessageType) {
3
+ MessageType["SYSTEM_PROMPT"] = "system_prompt";
4
+ MessageType["USER_INPUT"] = "user_input";
5
+ MessageType["TOOL_CALL"] = "tool_call";
6
+ MessageType["TOOL_RESULT"] = "tool_result";
7
+ MessageType["REASONING"] = "reasoning";
8
+ MessageType["TEXT_RESPONSE"] = "text_response";
9
+ MessageType["STEP_NUDGE"] = "step_nudge";
10
+ MessageType["PREREQUISITE_NUDGE"] = "prerequisite_nudge";
11
+ MessageType["RETRY_NUDGE"] = "retry_nudge";
12
+ MessageType["CONTEXT_WARNING"] = "context_warning";
13
+ MessageType["SUMMARY"] = "summary";
14
+ })(MessageType || (MessageType = {}));
15
+ export var Action;
16
+ (function (Action) {
17
+ Action["ALLOW"] = "allow";
18
+ Action["DENY"] = "deny";
19
+ Action["FILTER"] = "filter";
20
+ })(Action || (Action = {}));
21
+ export function createAllowDecision(reason = "allowed") {
22
+ return {
23
+ action: Action.ALLOW,
24
+ rule: "default",
25
+ reason,
26
+ timestamp: new Date(),
27
+ };
28
+ }
29
+ export function createDenyDecision(reason) {
30
+ return {
31
+ action: Action.DENY,
32
+ rule: "default",
33
+ reason,
34
+ timestamp: new Date(),
35
+ };
36
+ }
@@ -0,0 +1,10 @@
1
+ import type { ToolRegistry } from "../tools/index.js";
2
+ export interface PromptGenerator {
3
+ generateToolSection(registry: ToolRegistry): string;
4
+ generateToolSchemas(registry: ToolRegistry): object[];
5
+ }
6
+ export declare class DefaultPromptGenerator implements PromptGenerator {
7
+ generateToolSection(registry: ToolRegistry): string;
8
+ generateToolSchemas(registry: ToolRegistry): object[];
9
+ }
10
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/prompts/generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,eAAe;IAC9B,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAAC;IACpD,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAAC;CACvD;AAED,qBAAa,sBAAuB,YAAW,eAAe;IAC5D,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM;IAWnD,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE;CAatD"}
@@ -0,0 +1,24 @@
1
+ export class DefaultPromptGenerator {
2
+ generateToolSection(registry) {
3
+ const tools = registry.all();
4
+ if (tools.length === 0)
5
+ return "";
6
+ const lines = ["## Available Tools\n"];
7
+ for (const tool of tools) {
8
+ lines.push(`- **${tool.name}**: ${tool.description}`);
9
+ }
10
+ return lines.join("\n");
11
+ }
12
+ generateToolSchemas(registry) {
13
+ return registry.all().map((tool) => ({
14
+ type: "function",
15
+ function: {
16
+ name: tool.name,
17
+ description: tool.description,
18
+ parameters: "inputSchema" in tool
19
+ ? tool.inputSchema()
20
+ : {},
21
+ },
22
+ }));
23
+ }
24
+ }
@@ -0,0 +1,2 @@
1
+ export { PromptGenerator, DefaultPromptGenerator } from "./generator.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prompts/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { DefaultPromptGenerator } from "./generator.js";
@@ -0,0 +1,20 @@
1
+ import type { Tool, Result } from "../tools/index.js";
2
+ export interface ParsedToolCall {
3
+ id: string;
4
+ name: string;
5
+ args: Record<string, unknown>;
6
+ raw: string;
7
+ }
8
+ export interface ToolFormatter {
9
+ formatToolDefinitions(tools: Tool[]): string;
10
+ parseToolCalls(response: string): ParsedToolCall[];
11
+ formatToolResult(name: string, result: Result): string;
12
+ modelFamily(): string;
13
+ }
14
+ export declare class GenericFormatter implements ToolFormatter {
15
+ formatToolDefinitions(tools: Tool[]): string;
16
+ parseToolCalls(_response: string): ParsedToolCall[];
17
+ formatToolResult(name: string, result: Result): string;
18
+ modelFamily(): string;
19
+ }
20
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../../src/toolformat/formatter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAC7C,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IACnD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACvD,WAAW,IAAI,MAAM,CAAC;CACvB;AAED,qBAAa,gBAAiB,YAAW,aAAa;IACpD,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM;IAU5C,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,EAAE;IAInD,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAMtD,WAAW,IAAI,MAAM;CAGtB"}
@@ -0,0 +1,22 @@
1
+ export class GenericFormatter {
2
+ formatToolDefinitions(tools) {
3
+ if (tools.length === 0)
4
+ return "No tools available.";
5
+ const lines = ["Available tools:"];
6
+ for (const tool of tools) {
7
+ lines.push(`- ${tool.name}: ${tool.description}`);
8
+ }
9
+ return lines.join("\n");
10
+ }
11
+ parseToolCalls(_response) {
12
+ return [];
13
+ }
14
+ formatToolResult(name, result) {
15
+ return result.success
16
+ ? `Tool ${name} result: ${JSON.stringify(result.data)}`
17
+ : `Tool ${name} error: ${result.error}`;
18
+ }
19
+ modelFamily() {
20
+ return "generic";
21
+ }
22
+ }
@@ -0,0 +1,2 @@
1
+ export { ToolFormatter, ParsedToolCall, GenericFormatter } from "./formatter.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/toolformat/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ export { GenericFormatter } from "./formatter.js";
@@ -0,0 +1,42 @@
1
+ /** A sync or async tool handler with host-supplied context and cancellation. */
2
+ export type AsyncToolHandler<Input, Output, Context> = (input: Input, context: Context, signal: AbortSignal) => Output | Promise<Output>;
3
+ /** A wrapped tool handler. Kept separate so host frameworks can preserve schemas. */
4
+ export type WrappedTool<Input, Output, Context> = (input: Input, context: Context, options?: ToolInvocationOptions) => Promise<Output>;
5
+ /** Per-call cancellation and deadline controls. */
6
+ export interface ToolInvocationOptions {
7
+ readonly signal?: AbortSignal;
8
+ readonly timeoutMs?: number;
9
+ }
10
+ /** Safe lifecycle metadata; it intentionally excludes tool inputs and context. */
11
+ export interface ToolLifecycleEvent {
12
+ readonly type: "started" | "succeeded" | "failed" | "aborted" | "timed_out";
13
+ readonly toolName?: string;
14
+ readonly durationMs: number;
15
+ }
16
+ /** Best-effort event hook for metrics and tracing. Hook failures never affect a tool call. */
17
+ export type ToolLifecycleHook = (event: ToolLifecycleEvent) => void;
18
+ /** Options fixed when a handler is wrapped. */
19
+ export interface WrapToolOptions {
20
+ /** An optional safe identifier included in lifecycle events. */
21
+ readonly name?: string;
22
+ /** Default per-call deadline. A caller may override it through invocation options. */
23
+ readonly timeoutMs?: number;
24
+ /** Receives bounded lifecycle metadata, never raw inputs or context. */
25
+ readonly onEvent?: ToolLifecycleHook;
26
+ }
27
+ /** Raised when Agentware reaches an invocation deadline. */
28
+ export declare class ToolTimeoutError extends Error {
29
+ readonly timeoutMs: number;
30
+ constructor(timeoutMs: number);
31
+ }
32
+ /** Raised when the host cancels an invocation. */
33
+ export declare class ToolAbortedError extends Error {
34
+ constructor();
35
+ }
36
+ /**
37
+ * Wrap an existing tool without coupling it to a model framework, transport, or
38
+ * policy engine. The wrapper propagates host cancellation and an optional
39
+ * deadline through the handler's AbortSignal.
40
+ */
41
+ export declare function wrapTool<Input, Output, Context>(handler: AsyncToolHandler<Input, Output, Context>, options?: WrapToolOptions): WrappedTool<Input, Output, Context>;
42
+ //# sourceMappingURL=async.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async.d.ts","sourceRoot":"","sources":["../../src/tools/async.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,MAAM,MAAM,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,IAAI,CACrD,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,KAChB,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;AAE9B,qFAAqF;AACrF,MAAM,MAAM,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,IAAI,CAChD,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,qBAAqB,KAC5B,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,mDAAmD;AACnD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,kFAAkF;AAClF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;IAC5E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,8FAA8F;AAC9F,MAAM,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAEpE,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B,gEAAgE;IAChE,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,sFAAsF;IACtF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,QAAQ,CAAC,OAAO,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,4DAA4D;AAC5D,qBAAa,gBAAiB,SAAQ,KAAK;IACzC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;gBAEf,SAAS,EAAE,MAAM;CAK9B;AAED,kDAAkD;AAClD,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAuBD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAC7C,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EACjD,OAAO,GAAE,eAAoB,GAC5B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAsDrC"}
@@ -0,0 +1,89 @@
1
+ /** Raised when Agentware reaches an invocation deadline. */
2
+ export class ToolTimeoutError extends Error {
3
+ timeoutMs;
4
+ constructor(timeoutMs) {
5
+ super(`Tool execution timed out after ${timeoutMs}ms`);
6
+ this.name = "ToolTimeoutError";
7
+ this.timeoutMs = timeoutMs;
8
+ }
9
+ }
10
+ /** Raised when the host cancels an invocation. */
11
+ export class ToolAbortedError extends Error {
12
+ constructor() {
13
+ super("Tool execution was aborted");
14
+ this.name = "ToolAbortedError";
15
+ }
16
+ }
17
+ function validateTimeout(timeoutMs) {
18
+ if (timeoutMs === undefined)
19
+ return;
20
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
21
+ throw new RangeError("timeoutMs must be a finite positive number");
22
+ }
23
+ }
24
+ function emit(hook, type, toolName, startedAt) {
25
+ if (hook === undefined)
26
+ return;
27
+ try {
28
+ hook({ type, ...(toolName === undefined ? {} : { toolName }), durationMs: Date.now() - startedAt });
29
+ }
30
+ catch {
31
+ // Observability must not change the tool's execution result.
32
+ }
33
+ }
34
+ /**
35
+ * Wrap an existing tool without coupling it to a model framework, transport, or
36
+ * policy engine. The wrapper propagates host cancellation and an optional
37
+ * deadline through the handler's AbortSignal.
38
+ */
39
+ export function wrapTool(handler, options = {}) {
40
+ validateTimeout(options.timeoutMs);
41
+ return async (input, context, invocation = {}) => {
42
+ validateTimeout(invocation.timeoutMs);
43
+ const timeoutMs = invocation.timeoutMs ?? options.timeoutMs;
44
+ const startedAt = Date.now();
45
+ const controller = new AbortController();
46
+ const externalSignal = invocation.signal;
47
+ if (externalSignal?.aborted === true) {
48
+ emit(options.onEvent, "aborted", options.name, startedAt);
49
+ throw new ToolAbortedError();
50
+ }
51
+ let timer;
52
+ let rejectInterrupted;
53
+ const interrupted = new Promise((_, reject) => {
54
+ rejectInterrupted = reject;
55
+ });
56
+ const abort = () => {
57
+ controller.abort();
58
+ rejectInterrupted?.(new ToolAbortedError());
59
+ };
60
+ externalSignal?.addEventListener("abort", abort, { once: true });
61
+ if (timeoutMs !== undefined) {
62
+ timer = setTimeout(() => {
63
+ controller.abort();
64
+ rejectInterrupted?.(new ToolTimeoutError(timeoutMs));
65
+ }, timeoutMs);
66
+ }
67
+ emit(options.onEvent, "started", options.name, startedAt);
68
+ const execution = Promise.resolve().then(() => handler(input, context, controller.signal));
69
+ try {
70
+ const result = await Promise.race([execution, interrupted]);
71
+ emit(options.onEvent, "succeeded", options.name, startedAt);
72
+ return result;
73
+ }
74
+ catch (error) {
75
+ const type = error instanceof ToolTimeoutError
76
+ ? "timed_out"
77
+ : error instanceof ToolAbortedError
78
+ ? "aborted"
79
+ : "failed";
80
+ emit(options.onEvent, type, options.name, startedAt);
81
+ throw error;
82
+ }
83
+ finally {
84
+ if (timer !== undefined)
85
+ clearTimeout(timer);
86
+ externalSignal?.removeEventListener("abort", abort);
87
+ }
88
+ };
89
+ }
@@ -0,0 +1,5 @@
1
+ export { Tool, BaseTool, Result, ToolExample } from "./tool.js";
2
+ export { ToolRegistry } from "./registry.js";
3
+ export { wrapTool, ToolAbortedError, ToolTimeoutError, } from "./async.js";
4
+ export type { AsyncToolHandler, ToolInvocationOptions, ToolLifecycleEvent, ToolLifecycleHook, WrapToolOptions, WrappedTool, } from "./async.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EACL,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,EAClB,iBAAiB,EACjB,eAAe,EACf,WAAW,GACZ,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { BaseTool, Result } from "./tool.js";
2
+ export { ToolRegistry } from "./registry.js";
3
+ export { wrapTool, ToolAbortedError, ToolTimeoutError, } from "./async.js";
@@ -0,0 +1,11 @@
1
+ import type { Tool } from "./tool.js";
2
+ export declare class ToolRegistry {
3
+ private tools;
4
+ register(tool: Tool): void;
5
+ get(name: string): Tool | undefined;
6
+ all(): Tool[];
7
+ names(): string[];
8
+ schemas(): Record<string, Record<string, unknown>>;
9
+ clear(): void;
10
+ }
11
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,qBAAa,YAAY;IACvB,OAAO,CAAC,KAAK,CAAgC;IAE7C,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAI1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAInC,GAAG,IAAI,IAAI,EAAE;IAMb,KAAK,IAAI,MAAM,EAAE;IAIjB,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAUlD,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,27 @@
1
+ export class ToolRegistry {
2
+ tools = new Map();
3
+ register(tool) {
4
+ this.tools.set(tool.name, tool);
5
+ }
6
+ get(name) {
7
+ return this.tools.get(name);
8
+ }
9
+ all() {
10
+ return Array.from(this.tools.values()).sort((a, b) => a.name.localeCompare(b.name));
11
+ }
12
+ names() {
13
+ return Array.from(this.tools.keys()).sort();
14
+ }
15
+ schemas() {
16
+ const schemas = {};
17
+ for (const [name, tool] of this.tools) {
18
+ if ("inputSchema" in tool) {
19
+ schemas[name] = tool.inputSchema();
20
+ }
21
+ }
22
+ return schemas;
23
+ }
24
+ clear() {
25
+ this.tools.clear();
26
+ }
27
+ }
@@ -0,0 +1,29 @@
1
+ export interface Tool {
2
+ readonly name: string;
3
+ readonly description: string;
4
+ execute(args: Record<string, unknown>): Result;
5
+ }
6
+ export interface ToolExample {
7
+ input: Record<string, unknown>;
8
+ output: string;
9
+ explanation?: string;
10
+ }
11
+ export interface ExtendedTool extends Tool {
12
+ inputSchema(): Record<string, unknown>;
13
+ examples(): ToolExample[];
14
+ }
15
+ export declare class BaseTool implements Tool {
16
+ readonly name: string;
17
+ readonly description: string;
18
+ constructor(name: string, description: string);
19
+ execute(_args: Record<string, unknown>): Result;
20
+ }
21
+ export declare class Result {
22
+ success: boolean;
23
+ data: unknown;
24
+ error: string | null;
25
+ timestamp: Date;
26
+ constructor(success: boolean, data?: unknown, error?: string);
27
+ toJSON(): object;
28
+ }
29
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/tools/tool.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC;CAChD;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,QAAQ,IAAI,WAAW,EAAE,CAAC;CAC3B;AAED,qBAAa,QAAS,YAAW,IAAI;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;IAK7C,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM;CAGhD;AAED,qBAAa,MAAM;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,OAAO,CAAQ;IACrB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC5B,SAAS,EAAE,IAAI,CAAC;gBAEJ,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM;IAO5D,MAAM,IAAI,MAAM;CAQjB"}
@@ -0,0 +1,31 @@
1
+ export class BaseTool {
2
+ name;
3
+ description;
4
+ constructor(name, description) {
5
+ this.name = name;
6
+ this.description = description;
7
+ }
8
+ execute(_args) {
9
+ throw new Error("Subclass must implement execute");
10
+ }
11
+ }
12
+ export class Result {
13
+ success;
14
+ data = null;
15
+ error = null;
16
+ timestamp;
17
+ constructor(success, data, error) {
18
+ this.success = success;
19
+ this.data = data ?? null;
20
+ this.error = error ?? null;
21
+ this.timestamp = new Date();
22
+ }
23
+ toJSON() {
24
+ return {
25
+ success: this.success,
26
+ data: this.data,
27
+ error: this.error,
28
+ timestamp: this.timestamp.toISOString(),
29
+ };
30
+ }
31
+ }
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "@haikeilabs/agentware",
3
+ "version": "0.1.0",
4
+ "description": "Agent middleware and tooling for LLM tool calling",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "files": [
9
+ "dist",
10
+ "README.md"
11
+ ],
12
+ "scripts": {
13
+ "prepack": "npm run build",
14
+ "build": "tsc",
15
+ "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
16
+ "lint": "eslint src --ext .ts",
17
+ "format": "prettier --write \"src/**/*.ts\""
18
+ },
19
+ "keywords": [
20
+ "llm",
21
+ "agent",
22
+ "tool",
23
+ "middleware"
24
+ ],
25
+ "license": "Apache-2.0",
26
+ "authors": [
27
+ {
28
+ "name": "Pedro Team",
29
+ "email": "team@pedro.ai"
30
+ }
31
+ ],
32
+ "devDependencies": {
33
+ "@types/jest": "^29.5.0",
34
+ "@typescript-eslint/eslint-plugin": "^8.59.0",
35
+ "@typescript-eslint/parser": "^8.59.0",
36
+ "eslint": "^8.45.0",
37
+ "jest": "^29.7.0",
38
+ "prettier": "^3.0.0",
39
+ "ts-jest": "^29.1.0",
40
+ "typescript": "^5.3.0"
41
+ },
42
+ "dependencies": {
43
+ "minimatch": "10.2.3",
44
+ "zod": "^3.22.0"
45
+ },
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ }
49
+ }