@truefoundry/trueforge-core 0.2.0-rc.4 → 0.2.0-rc.6
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/dist/agent-session/ITurnResourceResolver.d.ts +6 -0
- package/dist/agent-session/ITurnResourceResolver.d.ts.map +1 -1
- package/dist/agent-session/ITurnResourceResolver.js.map +1 -1
- package/dist/agent-session/SessionHandle.d.ts.map +1 -1
- package/dist/agent-session/SessionHandle.js +2 -0
- package/dist/agent-session/SessionHandle.js.map +1 -1
- package/dist/agent-session/SessionHandle.mjs +2 -0
- package/dist/agent-session/SessionHandle.mjs.map +1 -1
- package/dist/agent-session/TurnResourceResolver.d.ts +8 -0
- package/dist/agent-session/TurnResourceResolver.d.ts.map +1 -1
- package/dist/agent-session/TurnResourceResolver.js +4 -0
- package/dist/agent-session/TurnResourceResolver.js.map +1 -1
- package/dist/agent-session/TurnResourceResolver.mjs +4 -0
- package/dist/agent-session/TurnResourceResolver.mjs.map +1 -1
- package/dist/agent-session/builtinsFromSpec.d.ts +2 -0
- package/dist/agent-session/builtinsFromSpec.d.ts.map +1 -1
- package/dist/agent-session/builtinsFromSpec.js +5 -1
- package/dist/agent-session/builtinsFromSpec.js.map +1 -1
- package/dist/agent-session/builtinsFromSpec.mjs +5 -1
- package/dist/agent-session/builtinsFromSpec.mjs.map +1 -1
- package/dist/agent-session/index.d.ts +2 -2
- package/dist/agent-session/index.d.ts.map +1 -1
- package/dist/agent-session/index.js +2 -0
- package/dist/agent-session/index.js.map +1 -1
- package/dist/agent-session/index.mjs +3 -1
- package/dist/agent-session/index.mjs.map +1 -1
- package/dist/agent-session/schemas/agentSpec.d.ts +6 -0
- package/dist/agent-session/schemas/agentSpec.d.ts.map +1 -1
- package/dist/agent-session/schemas/agentSpec.js +7 -3
- package/dist/agent-session/schemas/agentSpec.js.map +1 -1
- package/dist/agent-session/schemas/agentSpec.mjs +7 -3
- package/dist/agent-session/schemas/agentSpec.mjs.map +1 -1
- package/dist/agent-session/schemas/events.d.ts +65 -2
- package/dist/agent-session/schemas/events.d.ts.map +1 -1
- package/dist/agent-session/schemas/events.js +32 -2
- package/dist/agent-session/schemas/events.js.map +1 -1
- package/dist/agent-session/schemas/events.mjs +26 -1
- package/dist/agent-session/schemas/events.mjs.map +1 -1
- package/dist/agent-session/schemas/session.d.ts +9 -0
- package/dist/agent-session/schemas/session.d.ts.map +1 -1
- package/dist/core/capabilities/builtins/WebSearch.d.ts +32 -0
- package/dist/core/capabilities/builtins/WebSearch.d.ts.map +1 -0
- package/dist/core/capabilities/builtins/WebSearch.js +137 -0
- package/dist/core/capabilities/builtins/WebSearch.js.map +1 -0
- package/dist/core/capabilities/builtins/WebSearch.mjs +96 -0
- package/dist/core/capabilities/builtins/WebSearch.mjs.map +1 -0
- package/dist/core/index.d.ts +6 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +22 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/index.mjs +20 -0
- package/dist/core/index.mjs.map +1 -1
- package/dist/core/mcp/RemoteMCP.d.ts +2 -0
- package/dist/core/mcp/RemoteMCP.d.ts.map +1 -1
- package/dist/core/mcp/RemoteMCP.js +11 -1
- package/dist/core/mcp/RemoteMCP.js.map +1 -1
- package/dist/core/mcp/RemoteMCP.mjs +12 -1
- package/dist/core/mcp/RemoteMCP.mjs.map +1 -1
- package/dist/core/mcp/ToolSelectorPolicy.d.ts +1 -1
- package/dist/core/mcp/ToolSelectorPolicy.js +1 -1
- package/dist/core/mcp/ToolSelectorPolicy.js.map +1 -1
- package/dist/core/mcp/ToolSelectorPolicy.mjs +1 -1
- package/dist/core/mcp/ToolSelectorPolicy.mjs.map +1 -1
- package/dist/core/mcp/remoteMcpClient.d.ts +5 -0
- package/dist/core/mcp/remoteMcpClient.d.ts.map +1 -1
- package/dist/core/mcp/remoteMcpClient.js +49 -7
- package/dist/core/mcp/remoteMcpClient.js.map +1 -1
- package/dist/core/mcp/remoteMcpClient.mjs +46 -6
- package/dist/core/mcp/remoteMcpClient.mjs.map +1 -1
- package/dist/core/mcp/toolSelectors.d.ts.map +1 -1
- package/dist/core/mcp/toolSelectors.js +1 -1
- package/dist/core/mcp/toolSelectors.js.map +1 -1
- package/dist/core/mcp/toolSelectors.mjs +1 -1
- package/dist/core/mcp/toolSelectors.mjs.map +1 -1
- package/dist/core/web-search/ParallelWebSearchProvider.d.ts +24 -0
- package/dist/core/web-search/ParallelWebSearchProvider.d.ts.map +1 -0
- package/dist/core/web-search/ParallelWebSearchProvider.js +95 -0
- package/dist/core/web-search/ParallelWebSearchProvider.js.map +1 -0
- package/dist/core/web-search/ParallelWebSearchProvider.mjs +62 -0
- package/dist/core/web-search/ParallelWebSearchProvider.mjs.map +1 -0
- package/dist/core/web-search/WebSearchProvider.d.ts +42 -0
- package/dist/core/web-search/WebSearchProvider.d.ts.map +1 -0
- package/dist/core/web-search/WebSearchProvider.js +34 -0
- package/dist/core/web-search/WebSearchProvider.js.map +1 -0
- package/dist/core/web-search/WebSearchProvider.mjs +9 -0
- package/dist/core/web-search/WebSearchProvider.mjs.map +1 -0
- package/dist/request-reply/client.d.ts +2 -2
- package/dist/request-reply/client.d.ts.map +1 -1
- package/dist/request-reply/client.js +3 -0
- package/dist/request-reply/client.js.map +1 -1
- package/dist/request-reply/client.mjs +3 -0
- package/dist/request-reply/client.mjs.map +1 -1
- package/package.json +3 -1
|
@@ -9,7 +9,7 @@ var REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS = [TOOL_TAG_ALL, TOOL_TAG_WRITE, TOOL_T
|
|
|
9
9
|
var DEFAULT_ENABLE_TOOLS = [TOOL_TAG_ALL];
|
|
10
10
|
var DEFAULT_DISABLE_TOOLS = [];
|
|
11
11
|
var DEFAULT_PRELOAD_TOOLS = [];
|
|
12
|
-
var DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS = [
|
|
12
|
+
var DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS = [TOOL_TAG_DESTRUCTIVE];
|
|
13
13
|
function isToolTag(selector) {
|
|
14
14
|
return TOOL_TAGS.includes(selector);
|
|
15
15
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/mcp/toolSelectors.ts"],"sourcesContent":["import type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * MCP server tool selectors are either a special tag or a literal tool name.\n *\n * @all — every tool on the server\n * @read-only — readOnlyHint === true\n * @write — readOnlyHint === false and not destructive\n * @destructive — destructiveHint === true\n */\nconst TOOL_TAG_ALL = '@all';\nconst TOOL_TAG_READ_ONLY = '@read-only';\nconst TOOL_TAG_WRITE = '@write';\nconst TOOL_TAG_DESTRUCTIVE = '@destructive';\n\nconst TOOL_TAGS = [TOOL_TAG_ALL, TOOL_TAG_READ_ONLY, TOOL_TAG_WRITE, TOOL_TAG_DESTRUCTIVE] as const;\ntype ToolTag = (typeof TOOL_TAGS)[number];\n\n/** Tags allowed on `enable_tools`, `disable_tools`, and `preload_tools`. */\nexport const TOOLS_SELECTOR_TAGS = [TOOL_TAG_ALL, TOOL_TAG_READ_ONLY] as const;\n\n/** Tags allowed on `require_approval_for_tools`. */\nexport const REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS = [TOOL_TAG_ALL, TOOL_TAG_WRITE, TOOL_TAG_DESTRUCTIVE] as const;\n\nexport const DEFAULT_ENABLE_TOOLS: string[] = [TOOL_TAG_ALL];\nexport const DEFAULT_DISABLE_TOOLS: string[] = [];\nexport const DEFAULT_PRELOAD_TOOLS: string[] = [];\nexport const DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS: string[] = [
|
|
1
|
+
{"version":3,"sources":["../../../src/core/mcp/toolSelectors.ts"],"sourcesContent":["import type { ToolAnnotations } from '@modelcontextprotocol/sdk/types.js';\n\n/**\n * MCP server tool selectors are either a special tag or a literal tool name.\n *\n * @all — every tool on the server\n * @read-only — readOnlyHint === true\n * @write — readOnlyHint === false and not destructive\n * @destructive — destructiveHint === true\n */\nconst TOOL_TAG_ALL = '@all';\nconst TOOL_TAG_READ_ONLY = '@read-only';\nconst TOOL_TAG_WRITE = '@write';\nconst TOOL_TAG_DESTRUCTIVE = '@destructive';\n\nconst TOOL_TAGS = [TOOL_TAG_ALL, TOOL_TAG_READ_ONLY, TOOL_TAG_WRITE, TOOL_TAG_DESTRUCTIVE] as const;\ntype ToolTag = (typeof TOOL_TAGS)[number];\n\n/** Tags allowed on `enable_tools`, `disable_tools`, and `preload_tools`. */\nexport const TOOLS_SELECTOR_TAGS = [TOOL_TAG_ALL, TOOL_TAG_READ_ONLY] as const;\n\n/** Tags allowed on `require_approval_for_tools`. */\nexport const REQUIRE_APPROVAL_TOOLS_SELECTOR_TAGS = [TOOL_TAG_ALL, TOOL_TAG_WRITE, TOOL_TAG_DESTRUCTIVE] as const;\n\nexport const DEFAULT_ENABLE_TOOLS: string[] = [TOOL_TAG_ALL];\nexport const DEFAULT_DISABLE_TOOLS: string[] = [];\nexport const DEFAULT_PRELOAD_TOOLS: string[] = [];\nexport const DEFAULT_REQUIRE_APPROVAL_FOR_TOOLS: string[] = [TOOL_TAG_DESTRUCTIVE];\n\nfunction isToolTag(selector: string): selector is ToolTag {\n return TOOL_TAGS.includes(selector as ToolTag);\n}\n\nfunction isReadOnly(annotations?: ToolAnnotations): boolean {\n return annotations?.readOnlyHint === true;\n}\n\nfunction isWrite(annotations?: ToolAnnotations): boolean {\n return annotations?.readOnlyHint === false && annotations.destructiveHint !== true;\n}\n\nfunction isDestructive(annotations?: ToolAnnotations): boolean {\n return annotations?.destructiveHint === true;\n}\n\nfunction toolMatchesTag(tag: ToolTag, annotations: ToolAnnotations | undefined): boolean {\n switch (tag) {\n case TOOL_TAG_ALL:\n return true;\n case TOOL_TAG_READ_ONLY:\n return isReadOnly(annotations);\n case TOOL_TAG_WRITE:\n return isWrite(annotations);\n case TOOL_TAG_DESTRUCTIVE:\n return isDestructive(annotations);\n }\n}\n\n/** True if the tool matches any selector (tag or literal name). */\nexport function toolMatchesAnySelector(\n toolName: string,\n annotations: ToolAnnotations | undefined,\n selectors: readonly string[] | undefined,\n): boolean {\n if (!selectors?.length) {\n return false;\n }\n\n for (const selector of selectors) {\n if (isToolTag(selector)) {\n if (toolMatchesTag(selector, annotations)) {\n return true;\n }\n } else if (selector === toolName) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Whether the tool requires human approval before execution.\n * Matches `@write`, `@destructive`, `@all`, or explicit tool names against annotations.\n * Unannotated tools are exempt unless named in `require_approval_for_tools` or covered by `@all`.\n */\nexport function toolRequiresApproval(\n toolName: string,\n annotations: ToolAnnotations | undefined,\n selectors: readonly string[] | undefined,\n): boolean {\n if (!selectors?.length) {\n return false;\n }\n return toolMatchesAnySelector(toolName, annotations, selectors);\n}\n\n/** True if the tool is enabled and not disabled. */\nexport function isToolAllowed(params: {\n toolName: string;\n annotations: ToolAnnotations | undefined;\n enableSelectors: readonly string[];\n disableSelectors: readonly string[];\n}): boolean {\n const { toolName, annotations, enableSelectors, disableSelectors } = params;\n if (!toolMatchesAnySelector(toolName, annotations, enableSelectors)) {\n return false;\n }\n if (toolMatchesAnySelector(toolName, annotations, disableSelectors)) {\n return false;\n }\n return true;\n}\n\n/** Non-tag names from a selector list (for upfront validation / sandbox allow-lists). */\nexport function literalToolNames(selectors: readonly string[] | undefined): string[] {\n if (!selectors) {\n return [];\n }\n return selectors.filter(s => !isToolTag(s));\n}\n\nexport function selectorsIncludeAll(selectors: readonly string[] | undefined): boolean {\n return !!selectors?.includes(TOOL_TAG_ALL);\n}\n"],"mappings":";AAUA,IAAM,eAAe;AACrB,IAAM,qBAAqB;AAC3B,IAAM,iBAAiB;AACvB,IAAM,uBAAuB;AAE7B,IAAM,YAAY,CAAC,cAAc,oBAAoB,gBAAgB,oBAAoB;AAIlF,IAAM,sBAAsB,CAAC,cAAc,kBAAkB;AAG7D,IAAM,uCAAuC,CAAC,cAAc,gBAAgB,oBAAoB;AAEhG,IAAM,uBAAiC,CAAC,YAAY;AACpD,IAAM,wBAAkC,CAAC;AACzC,IAAM,wBAAkC,CAAC;AACzC,IAAM,qCAA+C,CAAC,oBAAoB;AAEjF,SAAS,UAAU,UAAuC;AACxD,SAAO,UAAU,SAAS,QAAmB;AAC/C;AAEA,SAAS,WAAW,aAAwC;AAC1D,SAAO,aAAa,iBAAiB;AACvC;AAEA,SAAS,QAAQ,aAAwC;AACvD,SAAO,aAAa,iBAAiB,SAAS,YAAY,oBAAoB;AAChF;AAEA,SAAS,cAAc,aAAwC;AAC7D,SAAO,aAAa,oBAAoB;AAC1C;AAEA,SAAS,eAAe,KAAc,aAAmD;AACvF,UAAQ,KAAK;AAAA,IACX,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO,WAAW,WAAW;AAAA,IAC/B,KAAK;AACH,aAAO,QAAQ,WAAW;AAAA,IAC5B,KAAK;AACH,aAAO,cAAc,WAAW;AAAA,EACpC;AACF;AAGO,SAAS,uBACd,UACA,aACA,WACS;AACT,MAAI,CAAC,WAAW,QAAQ;AACtB,WAAO;AAAA,EACT;AAEA,aAAW,YAAY,WAAW;AAChC,QAAI,UAAU,QAAQ,GAAG;AACvB,UAAI,eAAe,UAAU,WAAW,GAAG;AACzC,eAAO;AAAA,MACT;AAAA,IACF,WAAW,aAAa,UAAU;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,qBACd,UACA,aACA,WACS;AACT,MAAI,CAAC,WAAW,QAAQ;AACtB,WAAO;AAAA,EACT;AACA,SAAO,uBAAuB,UAAU,aAAa,SAAS;AAChE;AAGO,SAAS,cAAc,QAKlB;AACV,QAAM,EAAE,UAAU,aAAa,iBAAiB,iBAAiB,IAAI;AACrE,MAAI,CAAC,uBAAuB,UAAU,aAAa,eAAe,GAAG;AACnE,WAAO;AAAA,EACT;AACA,MAAI,uBAAuB,UAAU,aAAa,gBAAgB,GAAG;AACnE,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAGO,SAAS,iBAAiB,WAAoD;AACnF,MAAI,CAAC,WAAW;AACd,WAAO,CAAC;AAAA,EACV;AACA,SAAO,UAAU,OAAO,OAAK,CAAC,UAAU,CAAC,CAAC;AAC5C;AAEO,SAAS,oBAAoB,WAAmD;AACrF,SAAO,CAAC,CAAC,WAAW,SAAS,YAAY;AAC3C;","names":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { WebSearchProviders, type IWebSearchProvider, type WebFetchPages, type WebSearchHits } from './WebSearchProvider';
|
|
2
|
+
export type ParallelSearchMode = 'turbo' | 'fast' | 'basic' | 'advanced';
|
|
3
|
+
export interface ParallelWebSearchProviderOptions {
|
|
4
|
+
apiKey: string;
|
|
5
|
+
/** Parallel Search mode preset. Caller supplies the default (e.g. `turbo`). */
|
|
6
|
+
mode: ParallelSearchMode;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Parallel Search + Extract via the official `parallel-web` SDK.
|
|
10
|
+
*/
|
|
11
|
+
export declare class ParallelWebSearchProvider implements IWebSearchProvider {
|
|
12
|
+
#private;
|
|
13
|
+
readonly id = WebSearchProviders.Parallel;
|
|
14
|
+
constructor(options: ParallelWebSearchProviderOptions);
|
|
15
|
+
search(input: {
|
|
16
|
+
search_queries: string[];
|
|
17
|
+
objective: string | undefined;
|
|
18
|
+
}): Promise<WebSearchHits>;
|
|
19
|
+
fetch(input: {
|
|
20
|
+
urls: string[];
|
|
21
|
+
objective: string | undefined;
|
|
22
|
+
}): Promise<WebFetchPages>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=ParallelWebSearchProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParallelWebSearchProvider.d.ts","sourceRoot":"","sources":["../../../src/core/web-search/ParallelWebSearchProvider.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAClB,KAAK,aAAa,EACnB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;AAOzE,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,+EAA+E;IAC/E,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED;;GAEG;AACH,qBAAa,yBAA0B,YAAW,kBAAkB;;IAClE,QAAQ,CAAC,EAAE,+BAA+B;IAI1C,YAAY,OAAO,EAAE,gCAAgC,EAGpD;IAEK,MAAM,CAAC,KAAK,EAAE;QAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBvG;IAEK,KAAK,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAoB5F;CACF"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/core/web-search/ParallelWebSearchProvider.ts
|
|
31
|
+
var ParallelWebSearchProvider_exports = {};
|
|
32
|
+
__export(ParallelWebSearchProvider_exports, {
|
|
33
|
+
ParallelWebSearchProvider: () => ParallelWebSearchProvider
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(ParallelWebSearchProvider_exports);
|
|
36
|
+
var import_parallel_web = __toESM(require("parallel-web"), 1);
|
|
37
|
+
var import_WebSearchProvider = require("./WebSearchProvider.js");
|
|
38
|
+
var PARALLEL_SEARCH_MAX_RESULTS = 5;
|
|
39
|
+
var PARALLEL_SEARCH_MAX_CHARS_PER_RESULT = 500;
|
|
40
|
+
var PARALLEL_SEARCH_MAX_CHARS_TOTAL = 4e3;
|
|
41
|
+
var ParallelWebSearchProvider = class {
|
|
42
|
+
id = import_WebSearchProvider.WebSearchProviders.Parallel;
|
|
43
|
+
#client;
|
|
44
|
+
#mode;
|
|
45
|
+
constructor(options) {
|
|
46
|
+
this.#client = new import_parallel_web.default({ apiKey: options.apiKey });
|
|
47
|
+
this.#mode = options.mode;
|
|
48
|
+
}
|
|
49
|
+
async search(input) {
|
|
50
|
+
const response = await this.#client.search({
|
|
51
|
+
search_queries: input.search_queries,
|
|
52
|
+
...input.objective ? { objective: input.objective } : {},
|
|
53
|
+
mode: this.#mode,
|
|
54
|
+
max_chars_total: PARALLEL_SEARCH_MAX_CHARS_TOTAL,
|
|
55
|
+
advanced_settings: {
|
|
56
|
+
max_results: PARALLEL_SEARCH_MAX_RESULTS,
|
|
57
|
+
excerpt_settings: { max_chars_per_result: PARALLEL_SEARCH_MAX_CHARS_PER_RESULT }
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
return {
|
|
61
|
+
hits: response.results.map((result) => ({
|
|
62
|
+
title: result.title ?? "",
|
|
63
|
+
url: result.url,
|
|
64
|
+
snippet: result.excerpts.join("\n\n"),
|
|
65
|
+
published_at: result.publish_date ?? null
|
|
66
|
+
}))
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async fetch(input) {
|
|
70
|
+
const response = await this.#client.extract({
|
|
71
|
+
urls: input.urls,
|
|
72
|
+
...input.objective ? { objective: input.objective } : {}
|
|
73
|
+
});
|
|
74
|
+
const pages = [
|
|
75
|
+
...response.results.map((result) => ({
|
|
76
|
+
url: result.url,
|
|
77
|
+
title: result.title ?? null,
|
|
78
|
+
content: result.full_content ?? result.excerpts.join("\n\n"),
|
|
79
|
+
error: null
|
|
80
|
+
})),
|
|
81
|
+
...response.errors.map((err) => ({
|
|
82
|
+
url: err.url,
|
|
83
|
+
title: null,
|
|
84
|
+
content: "",
|
|
85
|
+
error: err.content ?? err.error_type
|
|
86
|
+
}))
|
|
87
|
+
];
|
|
88
|
+
return { pages };
|
|
89
|
+
}
|
|
90
|
+
};
|
|
91
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
92
|
+
0 && (module.exports = {
|
|
93
|
+
ParallelWebSearchProvider
|
|
94
|
+
});
|
|
95
|
+
//# sourceMappingURL=ParallelWebSearchProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/web-search/ParallelWebSearchProvider.ts"],"sourcesContent":["import Parallel from 'parallel-web';\nimport {\n WebSearchProviders,\n type IWebSearchProvider,\n type WebFetchPages,\n type WebSearchHits,\n} from './WebSearchProvider';\n\nexport type ParallelSearchMode = 'turbo' | 'fast' | 'basic' | 'advanced';\n\n/** Keep search payloads under the large-tool-response individual threshold (~6k tokens). */\nconst PARALLEL_SEARCH_MAX_RESULTS = 5;\nconst PARALLEL_SEARCH_MAX_CHARS_PER_RESULT = 500;\nconst PARALLEL_SEARCH_MAX_CHARS_TOTAL = 4000;\n\nexport interface ParallelWebSearchProviderOptions {\n apiKey: string;\n /** Parallel Search mode preset. Caller supplies the default (e.g. `turbo`). */\n mode: ParallelSearchMode;\n}\n\n/**\n * Parallel Search + Extract via the official `parallel-web` SDK.\n */\nexport class ParallelWebSearchProvider implements IWebSearchProvider {\n readonly id = WebSearchProviders.Parallel;\n readonly #client: Parallel;\n readonly #mode: ParallelSearchMode;\n\n constructor(options: ParallelWebSearchProviderOptions) {\n this.#client = new Parallel({ apiKey: options.apiKey });\n this.#mode = options.mode;\n }\n\n async search(input: { search_queries: string[]; objective: string | undefined }): Promise<WebSearchHits> {\n const response = await this.#client.search({\n search_queries: input.search_queries,\n ...(input.objective ? { objective: input.objective } : {}),\n mode: this.#mode,\n max_chars_total: PARALLEL_SEARCH_MAX_CHARS_TOTAL,\n advanced_settings: {\n max_results: PARALLEL_SEARCH_MAX_RESULTS,\n excerpt_settings: { max_chars_per_result: PARALLEL_SEARCH_MAX_CHARS_PER_RESULT },\n },\n });\n return {\n hits: response.results.map(result => ({\n title: result.title ?? '',\n url: result.url,\n snippet: result.excerpts.join('\\n\\n'),\n published_at: result.publish_date ?? null,\n })),\n };\n }\n\n async fetch(input: { urls: string[]; objective: string | undefined }): Promise<WebFetchPages> {\n const response = await this.#client.extract({\n urls: input.urls,\n ...(input.objective ? { objective: input.objective } : {}),\n });\n const pages = [\n ...response.results.map(result => ({\n url: result.url,\n title: result.title ?? null,\n content: result.full_content ?? result.excerpts.join('\\n\\n'),\n error: null,\n })),\n ...response.errors.map(err => ({\n url: err.url,\n title: null,\n content: '',\n error: err.content ?? err.error_type,\n })),\n ];\n return { pages };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0BAAqB;AACrB,+BAKO;AAKP,IAAM,8BAA8B;AACpC,IAAM,uCAAuC;AAC7C,IAAM,kCAAkC;AAWjC,IAAM,4BAAN,MAA8D;AAAA,EAC1D,KAAK,4CAAmB;AAAA,EACxB;AAAA,EACA;AAAA,EAET,YAAY,SAA2C;AACrD,SAAK,UAAU,IAAI,oBAAAA,QAAS,EAAE,QAAQ,QAAQ,OAAO,CAAC;AACtD,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,OAA4F;AACvG,UAAM,WAAW,MAAM,KAAK,QAAQ,OAAO;AAAA,MACzC,gBAAgB,MAAM;AAAA,MACtB,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MACxD,MAAM,KAAK;AAAA,MACX,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,QACjB,aAAa;AAAA,QACb,kBAAkB,EAAE,sBAAsB,qCAAqC;AAAA,MACjF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,MAAM,SAAS,QAAQ,IAAI,aAAW;AAAA,QACpC,OAAO,OAAO,SAAS;AAAA,QACvB,KAAK,OAAO;AAAA,QACZ,SAAS,OAAO,SAAS,KAAK,MAAM;AAAA,QACpC,cAAc,OAAO,gBAAgB;AAAA,MACvC,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,OAAkF;AAC5F,UAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAAA,MAC1C,MAAM,MAAM;AAAA,MACZ,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,IAC1D,CAAC;AACD,UAAM,QAAQ;AAAA,MACZ,GAAG,SAAS,QAAQ,IAAI,aAAW;AAAA,QACjC,KAAK,OAAO;AAAA,QACZ,OAAO,OAAO,SAAS;AAAA,QACvB,SAAS,OAAO,gBAAgB,OAAO,SAAS,KAAK,MAAM;AAAA,QAC3D,OAAO;AAAA,MACT,EAAE;AAAA,MACF,GAAG,SAAS,OAAO,IAAI,UAAQ;AAAA,QAC7B,KAAK,IAAI;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,OAAO,IAAI,WAAW,IAAI;AAAA,MAC5B,EAAE;AAAA,IACJ;AACA,WAAO,EAAE,MAAM;AAAA,EACjB;AACF;","names":["Parallel"]}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// src/core/web-search/ParallelWebSearchProvider.ts
|
|
2
|
+
import Parallel from "parallel-web";
|
|
3
|
+
import {
|
|
4
|
+
WebSearchProviders
|
|
5
|
+
} from "./WebSearchProvider.mjs";
|
|
6
|
+
var PARALLEL_SEARCH_MAX_RESULTS = 5;
|
|
7
|
+
var PARALLEL_SEARCH_MAX_CHARS_PER_RESULT = 500;
|
|
8
|
+
var PARALLEL_SEARCH_MAX_CHARS_TOTAL = 4e3;
|
|
9
|
+
var ParallelWebSearchProvider = class {
|
|
10
|
+
id = WebSearchProviders.Parallel;
|
|
11
|
+
#client;
|
|
12
|
+
#mode;
|
|
13
|
+
constructor(options) {
|
|
14
|
+
this.#client = new Parallel({ apiKey: options.apiKey });
|
|
15
|
+
this.#mode = options.mode;
|
|
16
|
+
}
|
|
17
|
+
async search(input) {
|
|
18
|
+
const response = await this.#client.search({
|
|
19
|
+
search_queries: input.search_queries,
|
|
20
|
+
...input.objective ? { objective: input.objective } : {},
|
|
21
|
+
mode: this.#mode,
|
|
22
|
+
max_chars_total: PARALLEL_SEARCH_MAX_CHARS_TOTAL,
|
|
23
|
+
advanced_settings: {
|
|
24
|
+
max_results: PARALLEL_SEARCH_MAX_RESULTS,
|
|
25
|
+
excerpt_settings: { max_chars_per_result: PARALLEL_SEARCH_MAX_CHARS_PER_RESULT }
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
return {
|
|
29
|
+
hits: response.results.map((result) => ({
|
|
30
|
+
title: result.title ?? "",
|
|
31
|
+
url: result.url,
|
|
32
|
+
snippet: result.excerpts.join("\n\n"),
|
|
33
|
+
published_at: result.publish_date ?? null
|
|
34
|
+
}))
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
async fetch(input) {
|
|
38
|
+
const response = await this.#client.extract({
|
|
39
|
+
urls: input.urls,
|
|
40
|
+
...input.objective ? { objective: input.objective } : {}
|
|
41
|
+
});
|
|
42
|
+
const pages = [
|
|
43
|
+
...response.results.map((result) => ({
|
|
44
|
+
url: result.url,
|
|
45
|
+
title: result.title ?? null,
|
|
46
|
+
content: result.full_content ?? result.excerpts.join("\n\n"),
|
|
47
|
+
error: null
|
|
48
|
+
})),
|
|
49
|
+
...response.errors.map((err) => ({
|
|
50
|
+
url: err.url,
|
|
51
|
+
title: null,
|
|
52
|
+
content: "",
|
|
53
|
+
error: err.content ?? err.error_type
|
|
54
|
+
}))
|
|
55
|
+
];
|
|
56
|
+
return { pages };
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
export {
|
|
60
|
+
ParallelWebSearchProvider
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=ParallelWebSearchProvider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/web-search/ParallelWebSearchProvider.ts"],"sourcesContent":["import Parallel from 'parallel-web';\nimport {\n WebSearchProviders,\n type IWebSearchProvider,\n type WebFetchPages,\n type WebSearchHits,\n} from './WebSearchProvider';\n\nexport type ParallelSearchMode = 'turbo' | 'fast' | 'basic' | 'advanced';\n\n/** Keep search payloads under the large-tool-response individual threshold (~6k tokens). */\nconst PARALLEL_SEARCH_MAX_RESULTS = 5;\nconst PARALLEL_SEARCH_MAX_CHARS_PER_RESULT = 500;\nconst PARALLEL_SEARCH_MAX_CHARS_TOTAL = 4000;\n\nexport interface ParallelWebSearchProviderOptions {\n apiKey: string;\n /** Parallel Search mode preset. Caller supplies the default (e.g. `turbo`). */\n mode: ParallelSearchMode;\n}\n\n/**\n * Parallel Search + Extract via the official `parallel-web` SDK.\n */\nexport class ParallelWebSearchProvider implements IWebSearchProvider {\n readonly id = WebSearchProviders.Parallel;\n readonly #client: Parallel;\n readonly #mode: ParallelSearchMode;\n\n constructor(options: ParallelWebSearchProviderOptions) {\n this.#client = new Parallel({ apiKey: options.apiKey });\n this.#mode = options.mode;\n }\n\n async search(input: { search_queries: string[]; objective: string | undefined }): Promise<WebSearchHits> {\n const response = await this.#client.search({\n search_queries: input.search_queries,\n ...(input.objective ? { objective: input.objective } : {}),\n mode: this.#mode,\n max_chars_total: PARALLEL_SEARCH_MAX_CHARS_TOTAL,\n advanced_settings: {\n max_results: PARALLEL_SEARCH_MAX_RESULTS,\n excerpt_settings: { max_chars_per_result: PARALLEL_SEARCH_MAX_CHARS_PER_RESULT },\n },\n });\n return {\n hits: response.results.map(result => ({\n title: result.title ?? '',\n url: result.url,\n snippet: result.excerpts.join('\\n\\n'),\n published_at: result.publish_date ?? null,\n })),\n };\n }\n\n async fetch(input: { urls: string[]; objective: string | undefined }): Promise<WebFetchPages> {\n const response = await this.#client.extract({\n urls: input.urls,\n ...(input.objective ? { objective: input.objective } : {}),\n });\n const pages = [\n ...response.results.map(result => ({\n url: result.url,\n title: result.title ?? null,\n content: result.full_content ?? result.excerpts.join('\\n\\n'),\n error: null,\n })),\n ...response.errors.map(err => ({\n url: err.url,\n title: null,\n content: '',\n error: err.content ?? err.error_type,\n })),\n ];\n return { pages };\n }\n}\n"],"mappings":";AAAA,OAAO,cAAc;AACrB;AAAA,EACE;AAAA,OAIK;AAKP,IAAM,8BAA8B;AACpC,IAAM,uCAAuC;AAC7C,IAAM,kCAAkC;AAWjC,IAAM,4BAAN,MAA8D;AAAA,EAC1D,KAAK,mBAAmB;AAAA,EACxB;AAAA,EACA;AAAA,EAET,YAAY,SAA2C;AACrD,SAAK,UAAU,IAAI,SAAS,EAAE,QAAQ,QAAQ,OAAO,CAAC;AACtD,SAAK,QAAQ,QAAQ;AAAA,EACvB;AAAA,EAEA,MAAM,OAAO,OAA4F;AACvG,UAAM,WAAW,MAAM,KAAK,QAAQ,OAAO;AAAA,MACzC,gBAAgB,MAAM;AAAA,MACtB,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,MACxD,MAAM,KAAK;AAAA,MACX,iBAAiB;AAAA,MACjB,mBAAmB;AAAA,QACjB,aAAa;AAAA,QACb,kBAAkB,EAAE,sBAAsB,qCAAqC;AAAA,MACjF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,MAAM,SAAS,QAAQ,IAAI,aAAW;AAAA,QACpC,OAAO,OAAO,SAAS;AAAA,QACvB,KAAK,OAAO;AAAA,QACZ,SAAS,OAAO,SAAS,KAAK,MAAM;AAAA,QACpC,cAAc,OAAO,gBAAgB;AAAA,MACvC,EAAE;AAAA,IACJ;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,OAAkF;AAC5F,UAAM,WAAW,MAAM,KAAK,QAAQ,QAAQ;AAAA,MAC1C,MAAM,MAAM;AAAA,MACZ,GAAI,MAAM,YAAY,EAAE,WAAW,MAAM,UAAU,IAAI,CAAC;AAAA,IAC1D,CAAC;AACD,UAAM,QAAQ;AAAA,MACZ,GAAG,SAAS,QAAQ,IAAI,aAAW;AAAA,QACjC,KAAK,OAAO;AAAA,QACZ,OAAO,OAAO,SAAS;AAAA,QACvB,SAAS,OAAO,gBAAgB,OAAO,SAAS,KAAK,MAAM;AAAA,QAC3D,OAAO;AAAA,MACT,EAAE;AAAA,MACF,GAAG,SAAS,OAAO,IAAI,UAAQ;AAAA,QAC7B,KAAK,IAAI;AAAA,QACT,OAAO;AAAA,QACP,SAAS;AAAA,QACT,OAAO,IAAI,WAAW,IAAI;AAAA,MAC5B,EAAE;AAAA,IACJ;AACA,WAAO,EAAE,MAAM;AAAA,EACjB;AACF;","names":[]}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/** Supported host web-search backends (env `TRUEFOUNDRY_WEB_SEARCH_PROVIDER.name`). */
|
|
2
|
+
export declare enum WebSearchProviders {
|
|
3
|
+
Parallel = "parallel"
|
|
4
|
+
}
|
|
5
|
+
/** One search hit in the provider-normalized shape. */
|
|
6
|
+
export interface WebSearchHit {
|
|
7
|
+
title: string;
|
|
8
|
+
url: string;
|
|
9
|
+
snippet: string;
|
|
10
|
+
published_at: string | null;
|
|
11
|
+
}
|
|
12
|
+
/** Normalized search response — stable across providers. */
|
|
13
|
+
export interface WebSearchHits {
|
|
14
|
+
hits: WebSearchHit[];
|
|
15
|
+
}
|
|
16
|
+
/** One fetched page (or per-URL error) in the provider-normalized shape. */
|
|
17
|
+
export interface WebFetchPage {
|
|
18
|
+
url: string;
|
|
19
|
+
title: string | null;
|
|
20
|
+
content: string;
|
|
21
|
+
error: string | null;
|
|
22
|
+
}
|
|
23
|
+
/** Normalized fetch/extract response — stable across providers. */
|
|
24
|
+
export interface WebFetchPages {
|
|
25
|
+
pages: WebFetchPage[];
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Host-supplied web search backend. Implementations map vendor APIs onto
|
|
29
|
+
* {@link WebSearchHits} / {@link WebFetchPages} so the capability tools stay provider-agnostic.
|
|
30
|
+
*/
|
|
31
|
+
export interface IWebSearchProvider {
|
|
32
|
+
readonly id: WebSearchProviders;
|
|
33
|
+
search(input: {
|
|
34
|
+
search_queries: string[];
|
|
35
|
+
objective: string | undefined;
|
|
36
|
+
}): Promise<WebSearchHits>;
|
|
37
|
+
fetch(input: {
|
|
38
|
+
urls: string[];
|
|
39
|
+
objective: string | undefined;
|
|
40
|
+
}): Promise<WebFetchPages>;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=WebSearchProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebSearchProvider.d.ts","sourceRoot":"","sources":["../../../src/core/web-search/WebSearchProvider.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,oBAAY,kBAAkB;IAC5B,QAAQ,aAAa;CACtB;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,4DAA4D;AAC5D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,EAAE,CAAC;CACtB;AAED,4EAA4E;AAC5E,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAED,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,YAAY,EAAE,CAAC;CACvB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,EAAE,kBAAkB,CAAC;IAChC,MAAM,CAAC,KAAK,EAAE;QAAE,cAAc,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACnG,KAAK,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;CACzF"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/core/web-search/WebSearchProvider.ts
|
|
21
|
+
var WebSearchProvider_exports = {};
|
|
22
|
+
__export(WebSearchProvider_exports, {
|
|
23
|
+
WebSearchProviders: () => WebSearchProviders
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(WebSearchProvider_exports);
|
|
26
|
+
var WebSearchProviders = /* @__PURE__ */ ((WebSearchProviders2) => {
|
|
27
|
+
WebSearchProviders2["Parallel"] = "parallel";
|
|
28
|
+
return WebSearchProviders2;
|
|
29
|
+
})(WebSearchProviders || {});
|
|
30
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
31
|
+
0 && (module.exports = {
|
|
32
|
+
WebSearchProviders
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=WebSearchProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/web-search/WebSearchProvider.ts"],"sourcesContent":["/** Supported host web-search backends (env `TRUEFOUNDRY_WEB_SEARCH_PROVIDER.name`). */\nexport enum WebSearchProviders {\n Parallel = 'parallel',\n}\n\n/** One search hit in the provider-normalized shape. */\nexport interface WebSearchHit {\n title: string;\n url: string;\n snippet: string;\n published_at: string | null;\n}\n\n/** Normalized search response — stable across providers. */\nexport interface WebSearchHits {\n hits: WebSearchHit[];\n}\n\n/** One fetched page (or per-URL error) in the provider-normalized shape. */\nexport interface WebFetchPage {\n url: string;\n title: string | null;\n content: string;\n error: string | null;\n}\n\n/** Normalized fetch/extract response — stable across providers. */\nexport interface WebFetchPages {\n pages: WebFetchPage[];\n}\n\n/**\n * Host-supplied web search backend. Implementations map vendor APIs onto\n * {@link WebSearchHits} / {@link WebFetchPages} so the capability tools stay provider-agnostic.\n */\nexport interface IWebSearchProvider {\n readonly id: WebSearchProviders;\n search(input: { search_queries: string[]; objective: string | undefined }): Promise<WebSearchHits>;\n fetch(input: { urls: string[]; objective: string | undefined }): Promise<WebFetchPages>;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACO,IAAK,qBAAL,kBAAKA,wBAAL;AACL,EAAAA,oBAAA,cAAW;AADD,SAAAA;AAAA,GAAA;","names":["WebSearchProviders"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
// src/core/web-search/WebSearchProvider.ts
|
|
2
|
+
var WebSearchProviders = /* @__PURE__ */ ((WebSearchProviders2) => {
|
|
3
|
+
WebSearchProviders2["Parallel"] = "parallel";
|
|
4
|
+
return WebSearchProviders2;
|
|
5
|
+
})(WebSearchProviders || {});
|
|
6
|
+
export {
|
|
7
|
+
WebSearchProviders
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=WebSearchProvider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/core/web-search/WebSearchProvider.ts"],"sourcesContent":["/** Supported host web-search backends (env `TRUEFOUNDRY_WEB_SEARCH_PROVIDER.name`). */\nexport enum WebSearchProviders {\n Parallel = 'parallel',\n}\n\n/** One search hit in the provider-normalized shape. */\nexport interface WebSearchHit {\n title: string;\n url: string;\n snippet: string;\n published_at: string | null;\n}\n\n/** Normalized search response — stable across providers. */\nexport interface WebSearchHits {\n hits: WebSearchHit[];\n}\n\n/** One fetched page (or per-URL error) in the provider-normalized shape. */\nexport interface WebFetchPage {\n url: string;\n title: string | null;\n content: string;\n error: string | null;\n}\n\n/** Normalized fetch/extract response — stable across providers. */\nexport interface WebFetchPages {\n pages: WebFetchPage[];\n}\n\n/**\n * Host-supplied web search backend. Implementations map vendor APIs onto\n * {@link WebSearchHits} / {@link WebFetchPages} so the capability tools stay provider-agnostic.\n */\nexport interface IWebSearchProvider {\n readonly id: WebSearchProviders;\n search(input: { search_queries: string[]; objective: string | undefined }): Promise<WebSearchHits>;\n fetch(input: { urls: string[]; objective: string | undefined }): Promise<WebFetchPages>;\n}\n"],"mappings":";AACO,IAAK,qBAAL,kBAAKA,wBAAL;AACL,EAAAA,oBAAA,cAAW;AADD,SAAAA;AAAA,GAAA;","names":["WebSearchProviders"]}
|
|
@@ -8,8 +8,8 @@ export interface SendRequestOptions {
|
|
|
8
8
|
}
|
|
9
9
|
/**
|
|
10
10
|
* Publishes the request (JSON) on the worker channel, then polls the reply key with GETDEL
|
|
11
|
-
* (see https://redis.io/docs/latest/commands/getdel/ ) until a result arrives
|
|
12
|
-
* budget is exceeded.
|
|
11
|
+
* (see https://redis.io/docs/latest/commands/getdel/ ) until a result arrives, the executor
|
|
12
|
+
* heartbeat expires, or the wait budget is exceeded.
|
|
13
13
|
*/
|
|
14
14
|
export declare function redisRequest<T extends JSONValue>({ redis: redisClient, executorId, path, request, options, }: {
|
|
15
15
|
redis: RedisClientType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/request-reply/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAoB,eAAe,EAAE,MAAM,SAAS,CAAC;AAIvF,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,cAAc,EAAE,MAAM,CAAC;CACxB;AAyBD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,EACtD,KAAK,EAAE,WAAW,EAClB,UAAU,EACV,IAAI,EACJ,OAAO,EACP,OAAO,GACR,EAAE;IACD,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC;CACnD,GAAG,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/request-reply/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC;AAE7C,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAoB,eAAe,EAAE,MAAM,SAAS,CAAC;AAIvF,MAAM,WAAW,kBAAkB;IACjC,wEAAwE;IACxE,cAAc,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,cAAc,EAAE,MAAM,CAAC;CACxB;AAyBD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,SAAS,SAAS,EAAE,EACtD,KAAK,EAAE,WAAW,EAClB,UAAU,EACV,IAAI,EACJ,OAAO,EACP,OAAO,GACR,EAAE;IACD,KAAK,EAAE,eAAe,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,SAAS,CAAC;CACnD,GAAG,OAAO,CAAC,SAAS,CAAC,CAuCrB"}
|
|
@@ -79,6 +79,9 @@ async function redisRequest({
|
|
|
79
79
|
if (replyPayload) {
|
|
80
80
|
return replyPayload;
|
|
81
81
|
}
|
|
82
|
+
if (await redisClient.exists(aliveK) === 0) {
|
|
83
|
+
throw new import_errors.NoResponderError(executorId);
|
|
84
|
+
}
|
|
82
85
|
if (import_node_perf_hooks.performance.now() >= replyDeadline) {
|
|
83
86
|
throw new import_errors.RequestTimeoutError(replyTimeoutMs);
|
|
84
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/request-reply/client.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { performance } from 'node:perf_hooks';\nimport type { RedisClientType } from 'redis';\nimport { NoResponderError, RequestTimeoutError } from './errors';\nimport type { JSONReply, JSONValue, PublishedRequest, RequestEnvelope } from './types';\nimport { jsonReplySchema } from './types';\nimport { heartbeatKey, replyKey, requestChannel, sleep } from './utils';\n\nexport interface SendRequestOptions {\n /** Max time to wait for a reply after the request is published (ms). */\n replyTimeoutMs: number;\n /** Sleep between poll attempts when the reply is not yet present (ms). */\n pollIntervalMs: number;\n}\n\nconst DEFAULT_REPLY_TIMEOUT_MS = 60_000;\nconst DEFAULT_POLL_INTERVAL_MS = 500;\n\nfunction resolveSendRequestOptions(options: Partial<SendRequestOptions> | undefined): SendRequestOptions {\n return {\n replyTimeoutMs: options?.replyTimeoutMs ?? DEFAULT_REPLY_TIMEOUT_MS,\n pollIntervalMs: options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,\n };\n}\n\nfunction parseReplyPayload(raw: string) {\n const parsed: unknown = JSON.parse(raw);\n return jsonReplySchema.parse(parsed);\n}\n\nasync function getDelReply(redisClient: RedisClientType, rKey: string): Promise<JSONReply | null> {\n const raw = await redisClient.getDel(rKey);\n if (raw === null) {\n return null;\n }\n return parseReplyPayload(raw);\n}\n\n/**\n * Publishes the request (JSON) on the worker channel, then polls the reply key with GETDEL\n * (see https://redis.io/docs/latest/commands/getdel/ ) until a result arrives
|
|
1
|
+
{"version":3,"sources":["../../src/request-reply/client.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { performance } from 'node:perf_hooks';\nimport type { RedisClientType } from 'redis';\nimport { NoResponderError, RequestTimeoutError } from './errors';\nimport type { JSONReply, JSONValue, PublishedRequest, RequestEnvelope } from './types';\nimport { jsonReplySchema } from './types';\nimport { heartbeatKey, replyKey, requestChannel, sleep } from './utils';\n\nexport interface SendRequestOptions {\n /** Max time to wait for a reply after the request is published (ms). */\n replyTimeoutMs: number;\n /** Sleep between poll attempts when the reply is not yet present (ms). */\n pollIntervalMs: number;\n}\n\nconst DEFAULT_REPLY_TIMEOUT_MS = 60_000;\nconst DEFAULT_POLL_INTERVAL_MS = 500;\n\nfunction resolveSendRequestOptions(options: Partial<SendRequestOptions> | undefined): SendRequestOptions {\n return {\n replyTimeoutMs: options?.replyTimeoutMs ?? DEFAULT_REPLY_TIMEOUT_MS,\n pollIntervalMs: options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,\n };\n}\n\nfunction parseReplyPayload(raw: string) {\n const parsed: unknown = JSON.parse(raw);\n return jsonReplySchema.parse(parsed);\n}\n\nasync function getDelReply(redisClient: RedisClientType, rKey: string): Promise<JSONReply | null> {\n const raw = await redisClient.getDel(rKey);\n if (raw === null) {\n return null;\n }\n return parseReplyPayload(raw);\n}\n\n/**\n * Publishes the request (JSON) on the worker channel, then polls the reply key with GETDEL\n * (see https://redis.io/docs/latest/commands/getdel/ ) until a result arrives, the executor\n * heartbeat expires, or the wait budget is exceeded.\n */\nexport async function redisRequest<T extends JSONValue>({\n redis: redisClient,\n executorId,\n path,\n request,\n options,\n}: {\n redis: RedisClientType;\n executorId: string;\n path: string;\n request: RequestEnvelope<T>;\n options?: Partial<SendRequestOptions> | undefined;\n}): Promise<JSONReply> {\n const { replyTimeoutMs, pollIntervalMs } = resolveSendRequestOptions(options);\n const aliveK = heartbeatKey(executorId);\n if ((await redisClient.exists(aliveK)) === 0) {\n throw new NoResponderError(executorId);\n }\n\n const requestId = randomUUID();\n const rKey = replyKey(requestId);\n const payload: PublishedRequest = {\n replyKey: rKey,\n path,\n body: request.body,\n headers: request.headers,\n };\n const serializedPayload = JSON.stringify(payload);\n const subscriberCount = await redisClient.publish(requestChannel(executorId), serializedPayload);\n if (subscriberCount === 0) {\n throw new NoResponderError(executorId, 'No executor received the published request');\n }\n\n const replyDeadline = performance.now() + replyTimeoutMs;\n // Give the executor a moment to process before the first poll.\n await sleep(Math.min(200, replyTimeoutMs));\n for (;;) {\n const replyPayload = await getDelReply(redisClient, rKey);\n if (replyPayload) {\n return replyPayload;\n }\n // We already checked that the executor was alive before sending, but it may have\n // died while we wait. Recheck here so we fail soon instead of waiting until the timeout.\n if ((await redisClient.exists(aliveK)) === 0) {\n throw new NoResponderError(executorId);\n }\n if (performance.now() >= replyDeadline) {\n throw new RequestTimeoutError(replyTimeoutMs);\n }\n await sleep(pollIntervalMs);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA2B;AAC3B,6BAA4B;AAE5B,oBAAsD;AAEtD,mBAAgC;AAChC,mBAA8D;AAS9D,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AAEjC,SAAS,0BAA0B,SAAsE;AACvG,SAAO;AAAA,IACL,gBAAgB,SAAS,kBAAkB;AAAA,IAC3C,gBAAgB,SAAS,kBAAkB;AAAA,EAC7C;AACF;AAEA,SAAS,kBAAkB,KAAa;AACtC,QAAM,SAAkB,KAAK,MAAM,GAAG;AACtC,SAAO,6BAAgB,MAAM,MAAM;AACrC;AAEA,eAAe,YAAY,aAA8B,MAAyC;AAChG,QAAM,MAAM,MAAM,YAAY,OAAO,IAAI;AACzC,MAAI,QAAQ,MAAM;AAChB,WAAO;AAAA,EACT;AACA,SAAO,kBAAkB,GAAG;AAC9B;AAOA,eAAsB,aAAkC;AAAA,EACtD,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMuB;AACrB,QAAM,EAAE,gBAAgB,eAAe,IAAI,0BAA0B,OAAO;AAC5E,QAAM,aAAS,2BAAa,UAAU;AACtC,MAAK,MAAM,YAAY,OAAO,MAAM,MAAO,GAAG;AAC5C,UAAM,IAAI,+BAAiB,UAAU;AAAA,EACvC;AAEA,QAAM,gBAAY,+BAAW;AAC7B,QAAM,WAAO,uBAAS,SAAS;AAC/B,QAAM,UAA4B;AAAA,IAChC,UAAU;AAAA,IACV;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,EACnB;AACA,QAAM,oBAAoB,KAAK,UAAU,OAAO;AAChD,QAAM,kBAAkB,MAAM,YAAY,YAAQ,6BAAe,UAAU,GAAG,iBAAiB;AAC/F,MAAI,oBAAoB,GAAG;AACzB,UAAM,IAAI,+BAAiB,YAAY,4CAA4C;AAAA,EACrF;AAEA,QAAM,gBAAgB,mCAAY,IAAI,IAAI;AAE1C,YAAM,oBAAM,KAAK,IAAI,KAAK,cAAc,CAAC;AACzC,aAAS;AACP,UAAM,eAAe,MAAM,YAAY,aAAa,IAAI;AACxD,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAGA,QAAK,MAAM,YAAY,OAAO,MAAM,MAAO,GAAG;AAC5C,YAAM,IAAI,+BAAiB,UAAU;AAAA,IACvC;AACA,QAAI,mCAAY,IAAI,KAAK,eAAe;AACtC,YAAM,IAAI,kCAAoB,cAAc;AAAA,IAC9C;AACA,cAAM,oBAAM,cAAc;AAAA,EAC5B;AACF;","names":[]}
|
|
@@ -55,6 +55,9 @@ async function redisRequest({
|
|
|
55
55
|
if (replyPayload) {
|
|
56
56
|
return replyPayload;
|
|
57
57
|
}
|
|
58
|
+
if (await redisClient.exists(aliveK) === 0) {
|
|
59
|
+
throw new NoResponderError(executorId);
|
|
60
|
+
}
|
|
58
61
|
if (performance.now() >= replyDeadline) {
|
|
59
62
|
throw new RequestTimeoutError(replyTimeoutMs);
|
|
60
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/request-reply/client.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { performance } from 'node:perf_hooks';\nimport type { RedisClientType } from 'redis';\nimport { NoResponderError, RequestTimeoutError } from './errors';\nimport type { JSONReply, JSONValue, PublishedRequest, RequestEnvelope } from './types';\nimport { jsonReplySchema } from './types';\nimport { heartbeatKey, replyKey, requestChannel, sleep } from './utils';\n\nexport interface SendRequestOptions {\n /** Max time to wait for a reply after the request is published (ms). */\n replyTimeoutMs: number;\n /** Sleep between poll attempts when the reply is not yet present (ms). */\n pollIntervalMs: number;\n}\n\nconst DEFAULT_REPLY_TIMEOUT_MS = 60_000;\nconst DEFAULT_POLL_INTERVAL_MS = 500;\n\nfunction resolveSendRequestOptions(options: Partial<SendRequestOptions> | undefined): SendRequestOptions {\n return {\n replyTimeoutMs: options?.replyTimeoutMs ?? DEFAULT_REPLY_TIMEOUT_MS,\n pollIntervalMs: options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,\n };\n}\n\nfunction parseReplyPayload(raw: string) {\n const parsed: unknown = JSON.parse(raw);\n return jsonReplySchema.parse(parsed);\n}\n\nasync function getDelReply(redisClient: RedisClientType, rKey: string): Promise<JSONReply | null> {\n const raw = await redisClient.getDel(rKey);\n if (raw === null) {\n return null;\n }\n return parseReplyPayload(raw);\n}\n\n/**\n * Publishes the request (JSON) on the worker channel, then polls the reply key with GETDEL\n * (see https://redis.io/docs/latest/commands/getdel/ ) until a result arrives
|
|
1
|
+
{"version":3,"sources":["../../src/request-reply/client.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\nimport { performance } from 'node:perf_hooks';\nimport type { RedisClientType } from 'redis';\nimport { NoResponderError, RequestTimeoutError } from './errors';\nimport type { JSONReply, JSONValue, PublishedRequest, RequestEnvelope } from './types';\nimport { jsonReplySchema } from './types';\nimport { heartbeatKey, replyKey, requestChannel, sleep } from './utils';\n\nexport interface SendRequestOptions {\n /** Max time to wait for a reply after the request is published (ms). */\n replyTimeoutMs: number;\n /** Sleep between poll attempts when the reply is not yet present (ms). */\n pollIntervalMs: number;\n}\n\nconst DEFAULT_REPLY_TIMEOUT_MS = 60_000;\nconst DEFAULT_POLL_INTERVAL_MS = 500;\n\nfunction resolveSendRequestOptions(options: Partial<SendRequestOptions> | undefined): SendRequestOptions {\n return {\n replyTimeoutMs: options?.replyTimeoutMs ?? DEFAULT_REPLY_TIMEOUT_MS,\n pollIntervalMs: options?.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS,\n };\n}\n\nfunction parseReplyPayload(raw: string) {\n const parsed: unknown = JSON.parse(raw);\n return jsonReplySchema.parse(parsed);\n}\n\nasync function getDelReply(redisClient: RedisClientType, rKey: string): Promise<JSONReply | null> {\n const raw = await redisClient.getDel(rKey);\n if (raw === null) {\n return null;\n }\n return parseReplyPayload(raw);\n}\n\n/**\n * Publishes the request (JSON) on the worker channel, then polls the reply key with GETDEL\n * (see https://redis.io/docs/latest/commands/getdel/ ) until a result arrives, the executor\n * heartbeat expires, or the wait budget is exceeded.\n */\nexport async function redisRequest<T extends JSONValue>({\n redis: redisClient,\n executorId,\n path,\n request,\n options,\n}: {\n redis: RedisClientType;\n executorId: string;\n path: string;\n request: RequestEnvelope<T>;\n options?: Partial<SendRequestOptions> | undefined;\n}): Promise<JSONReply> {\n const { replyTimeoutMs, pollIntervalMs } = resolveSendRequestOptions(options);\n const aliveK = heartbeatKey(executorId);\n if ((await redisClient.exists(aliveK)) === 0) {\n throw new NoResponderError(executorId);\n }\n\n const requestId = randomUUID();\n const rKey = replyKey(requestId);\n const payload: PublishedRequest = {\n replyKey: rKey,\n path,\n body: request.body,\n headers: request.headers,\n };\n const serializedPayload = JSON.stringify(payload);\n const subscriberCount = await redisClient.publish(requestChannel(executorId), serializedPayload);\n if (subscriberCount === 0) {\n throw new NoResponderError(executorId, 'No executor received the published request');\n }\n\n const replyDeadline = performance.now() + replyTimeoutMs;\n // Give the executor a moment to process before the first poll.\n await sleep(Math.min(200, replyTimeoutMs));\n for (;;) {\n const replyPayload = await getDelReply(redisClient, rKey);\n if (replyPayload) {\n return replyPayload;\n }\n // We already checked that the executor was alive before sending, but it may have\n // died while we wait. Recheck here so we fail soon instead of waiting until the timeout.\n if ((await redisClient.exists(aliveK)) === 0) {\n throw new NoResponderError(executorId);\n }\n if (performance.now() >= replyDeadline) {\n throw new RequestTimeoutError(replyTimeoutMs);\n }\n await sleep(pollIntervalMs);\n }\n}\n"],"mappings":";AAAA,SAAS,kBAAkB;AAC3B,SAAS,mBAAmB;AAE5B,SAAS,kBAAkB,2BAA2B;AAEtD,SAAS,uBAAuB;AAChC,SAAS,cAAc,UAAU,gBAAgB,aAAa;AAS9D,IAAM,2BAA2B;AACjC,IAAM,2BAA2B;AAEjC,SAAS,0BAA0B,SAAsE;AACvG,SAAO;AAAA,IACL,gBAAgB,SAAS,kBAAkB;AAAA,IAC3C,gBAAgB,SAAS,kBAAkB;AAAA,EAC7C;AACF;AAEA,SAAS,kBAAkB,KAAa;AACtC,QAAM,SAAkB,KAAK,MAAM,GAAG;AACtC,SAAO,gBAAgB,MAAM,MAAM;AACrC;AAEA,eAAe,YAAY,aAA8B,MAAyC;AAChG,QAAM,MAAM,MAAM,YAAY,OAAO,IAAI;AACzC,MAAI,QAAQ,MAAM;AAChB,WAAO;AAAA,EACT;AACA,SAAO,kBAAkB,GAAG;AAC9B;AAOA,eAAsB,aAAkC;AAAA,EACtD,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMuB;AACrB,QAAM,EAAE,gBAAgB,eAAe,IAAI,0BAA0B,OAAO;AAC5E,QAAM,SAAS,aAAa,UAAU;AACtC,MAAK,MAAM,YAAY,OAAO,MAAM,MAAO,GAAG;AAC5C,UAAM,IAAI,iBAAiB,UAAU;AAAA,EACvC;AAEA,QAAM,YAAY,WAAW;AAC7B,QAAM,OAAO,SAAS,SAAS;AAC/B,QAAM,UAA4B;AAAA,IAChC,UAAU;AAAA,IACV;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,EACnB;AACA,QAAM,oBAAoB,KAAK,UAAU,OAAO;AAChD,QAAM,kBAAkB,MAAM,YAAY,QAAQ,eAAe,UAAU,GAAG,iBAAiB;AAC/F,MAAI,oBAAoB,GAAG;AACzB,UAAM,IAAI,iBAAiB,YAAY,4CAA4C;AAAA,EACrF;AAEA,QAAM,gBAAgB,YAAY,IAAI,IAAI;AAE1C,QAAM,MAAM,KAAK,IAAI,KAAK,cAAc,CAAC;AACzC,aAAS;AACP,UAAM,eAAe,MAAM,YAAY,aAAa,IAAI;AACxD,QAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAGA,QAAK,MAAM,YAAY,OAAO,MAAM,MAAO,GAAG;AAC5C,YAAM,IAAI,iBAAiB,UAAU;AAAA,IACvC;AACA,QAAI,YAAY,IAAI,KAAK,eAAe;AACtC,YAAM,IAAI,oBAAoB,cAAc;AAAA,IAC9C;AACA,UAAM,MAAM,cAAc;AAAA,EAC5B;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@truefoundry/trueforge-core",
|
|
3
|
-
"version": "0.2.0-rc.
|
|
3
|
+
"version": "0.2.0-rc.6",
|
|
4
4
|
"description": "TrueForge Agent Harness library.",
|
|
5
5
|
"author": "TrueFoundry",
|
|
6
6
|
"license": "MIT",
|
|
@@ -103,7 +103,9 @@
|
|
|
103
103
|
"ai": "^7.0.82",
|
|
104
104
|
"dedent": "^1.7.2",
|
|
105
105
|
"openai": "^7.5.0",
|
|
106
|
+
"parallel-web": "^1.3.3",
|
|
106
107
|
"ulid": "^3.0.2",
|
|
108
|
+
"undici": "7.29.0",
|
|
107
109
|
"winston": "^3.19.0",
|
|
108
110
|
"ws": "^8.21.3",
|
|
109
111
|
"zod": "^4.4.3"
|