formal-ai 0.299.0

Formal symbolic AI implementation with OpenAI-compatible APIs
Documentation
const NATIVE_READ_ONLY_TOOLS = new Set(["web_search", "web_fetch", "http_fetch", "url_navigate"]);

function nativeRequest(answer) {
  const calls = Array.isArray(answer && answer.toolCalls) ? answer.toolCalls : [];
  const call = calls.find((candidate) => NATIVE_READ_ONLY_TOOLS.has(candidate && candidate.tool));
  if (!call) return null;
  const inputs = call.inputs && typeof call.inputs === "object" ? call.inputs : {};
  if (call.tool === "web_search") {
    const query = String(inputs.query || "").trim();
    return query ? { call, tool: "web_search", input: { ...inputs, query } } : null;
  }
  const url = String(inputs.url || "").trim();
  return url ? { call, tool: "web_fetch", input: { ...inputs, url } } : null;
}

export async function enhanceWithDesktopReadOnlyTool(answer, invoke) {
  if (!answer || typeof invoke !== "function") return answer;
  const request = nativeRequest(answer);
  if (!request) return answer;
  let result;
  try {
    result = await invoke(request.tool, request.input);
  } catch (_error) {
    return answer;
  }
  if (!result || result.ok !== true || result.executed !== true || !result.body) return answer;
  const evidence = Array.isArray(answer.evidence) ? answer.evidence : [];
  const toolCalls = Array.isArray(answer.toolCalls)
    ? answer.toolCalls.map((call) =>
        call === request.call ? { ...call, tool: request.tool, outputs: result } : call,
      )
    : [];
  return {
    ...answer,
    content: String(result.body),
    evidence: [...evidence, `desktop_tool:${request.tool}`, "desktop_tool:permission_free"],
    toolCalls,
  };
}

export { nativeRequest };