@office-agents/sdk 0.0.1

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 (81) hide show
  1. package/dist/index.d.ts +18 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +29 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/lockdown.d.ts +3 -0
  6. package/dist/lockdown.d.ts.map +1 -0
  7. package/dist/lockdown.js +103 -0
  8. package/dist/lockdown.js.map +1 -0
  9. package/dist/message-utils.d.ts +44 -0
  10. package/dist/message-utils.d.ts.map +1 -0
  11. package/dist/message-utils.js +134 -0
  12. package/dist/message-utils.js.map +1 -0
  13. package/dist/oauth/index.d.ts +44 -0
  14. package/dist/oauth/index.d.ts.map +1 -0
  15. package/dist/oauth/index.js +259 -0
  16. package/dist/oauth/index.js.map +1 -0
  17. package/dist/provider-config.d.ts +29 -0
  18. package/dist/provider-config.d.ts.map +1 -0
  19. package/dist/provider-config.js +101 -0
  20. package/dist/provider-config.js.map +1 -0
  21. package/dist/runtime.d.ts +93 -0
  22. package/dist/runtime.d.ts.map +1 -0
  23. package/dist/runtime.js +688 -0
  24. package/dist/runtime.js.map +1 -0
  25. package/dist/sandbox.d.ts +2 -0
  26. package/dist/sandbox.d.ts.map +1 -0
  27. package/dist/sandbox.js +22 -0
  28. package/dist/sandbox.js.map +1 -0
  29. package/dist/skills/index.d.ts +16 -0
  30. package/dist/skills/index.d.ts.map +1 -0
  31. package/dist/skills/index.js +96 -0
  32. package/dist/skills/index.js.map +1 -0
  33. package/dist/storage/db.d.ts +55 -0
  34. package/dist/storage/db.d.ts.map +1 -0
  35. package/dist/storage/db.js +229 -0
  36. package/dist/storage/db.js.map +1 -0
  37. package/dist/storage/index.d.ts +4 -0
  38. package/dist/storage/index.d.ts.map +1 -0
  39. package/dist/storage/index.js +3 -0
  40. package/dist/storage/index.js.map +1 -0
  41. package/dist/storage/namespace.d.ts +9 -0
  42. package/dist/storage/namespace.d.ts.map +1 -0
  43. package/dist/storage/namespace.js +14 -0
  44. package/dist/storage/namespace.js.map +1 -0
  45. package/dist/tools/bash.d.ts +2 -0
  46. package/dist/tools/bash.d.ts.map +1 -0
  47. package/dist/tools/bash.js +69 -0
  48. package/dist/tools/bash.js.map +1 -0
  49. package/dist/tools/read-file.d.ts +2 -0
  50. package/dist/tools/read-file.d.ts.map +1 -0
  51. package/dist/tools/read-file.js +116 -0
  52. package/dist/tools/read-file.js.map +1 -0
  53. package/dist/tools/types.d.ts +16 -0
  54. package/dist/tools/types.d.ts.map +1 -0
  55. package/dist/tools/types.js +28 -0
  56. package/dist/tools/types.js.map +1 -0
  57. package/dist/truncate.d.ts +19 -0
  58. package/dist/truncate.d.ts.map +1 -0
  59. package/dist/truncate.js +101 -0
  60. package/dist/truncate.js.map +1 -0
  61. package/dist/vfs/index.d.ts +35 -0
  62. package/dist/vfs/index.d.ts.map +1 -0
  63. package/dist/vfs/index.js +168 -0
  64. package/dist/vfs/index.js.map +1 -0
  65. package/dist/web/config.d.ts +12 -0
  66. package/dist/web/config.d.ts.map +1 -0
  67. package/dist/web/config.js +41 -0
  68. package/dist/web/config.js.map +1 -0
  69. package/dist/web/fetch.d.ts +5 -0
  70. package/dist/web/fetch.d.ts.map +1 -0
  71. package/dist/web/fetch.js +174 -0
  72. package/dist/web/fetch.js.map +1 -0
  73. package/dist/web/search.d.ts +9 -0
  74. package/dist/web/search.d.ts.map +1 -0
  75. package/dist/web/search.js +238 -0
  76. package/dist/web/search.js.map +1 -0
  77. package/dist/web/types.d.ts +56 -0
  78. package/dist/web/types.d.ts.map +1 -0
  79. package/dist/web/types.js +2 -0
  80. package/dist/web/types.js.map +1 -0
  81. package/package.json +47 -0
@@ -0,0 +1,41 @@
1
+ import { getNamespace } from "../storage/namespace";
2
+ function webConfigKey() {
3
+ return `${getNamespace().localStoragePrefix}-web-config`;
4
+ }
5
+ const DEFAULT_WEB_CONFIG = {
6
+ searchProvider: "ddgs",
7
+ fetchProvider: "basic",
8
+ apiKeys: {},
9
+ };
10
+ export function loadWebConfig() {
11
+ try {
12
+ const raw = localStorage.getItem(webConfigKey());
13
+ if (!raw)
14
+ return { ...DEFAULT_WEB_CONFIG };
15
+ const parsed = JSON.parse(raw);
16
+ return {
17
+ searchProvider: parsed.searchProvider || DEFAULT_WEB_CONFIG.searchProvider,
18
+ fetchProvider: parsed.fetchProvider || DEFAULT_WEB_CONFIG.fetchProvider,
19
+ apiKeys: {
20
+ ...DEFAULT_WEB_CONFIG.apiKeys,
21
+ ...(parsed.apiKeys || {}),
22
+ },
23
+ };
24
+ }
25
+ catch {
26
+ return { ...DEFAULT_WEB_CONFIG };
27
+ }
28
+ }
29
+ export function saveWebConfig(config) {
30
+ const current = loadWebConfig();
31
+ const next = {
32
+ searchProvider: config.searchProvider || current.searchProvider,
33
+ fetchProvider: config.fetchProvider || current.fetchProvider,
34
+ apiKeys: {
35
+ ...current.apiKeys,
36
+ ...(config.apiKeys || {}),
37
+ },
38
+ };
39
+ localStorage.setItem(webConfigKey(), JSON.stringify(next));
40
+ }
41
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/web/config.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,SAAS,YAAY;IACnB,OAAO,GAAG,YAAY,EAAE,CAAC,kBAAkB,aAAa,CAAC;AAC3D,CAAC;AAED,MAAM,kBAAkB,GAAc;IACpC,cAAc,EAAE,MAAM;IACtB,aAAa,EAAE,OAAO;IACtB,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,GAAG,kBAAkB,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAuB,CAAC;QACrD,OAAO;YACL,cAAc,EACZ,MAAM,CAAC,cAAc,IAAI,kBAAkB,CAAC,cAAc;YAC5D,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,kBAAkB,CAAC,aAAa;YACvE,OAAO,EAAE;gBACP,GAAG,kBAAkB,CAAC,OAAO;gBAC7B,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;aAC1B;SACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,GAAG,kBAAkB,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAA0B;IACtD,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,MAAM,IAAI,GAAc;QACtB,cAAc,EAAE,MAAM,CAAC,cAAc,IAAI,OAAO,CAAC,cAAc;QAC/D,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,OAAO,CAAC,aAAa;QAC5D,OAAO,EAAE;YACP,GAAG,OAAO,CAAC,OAAO;YAClB,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;SAC1B;KACF,CAAC;IACF,YAAY,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { FetchProvider, FetchResult, WebContext } from "./types";
2
+ export declare function listFetchProviders(): string[];
3
+ export declare function getFetchProvider(providerId?: string): FetchProvider;
4
+ export declare function fetchWeb(url: string, context?: WebContext, providerId?: string): Promise<FetchResult>;
5
+ //# sourceMappingURL=fetch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.d.ts","sourceRoot":"","sources":["../../src/web/fetch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAgOtE,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C;AAED,wBAAgB,gBAAgB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa,CAGnE;AAED,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,UAAe,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,WAAW,CAAC,CAGtB"}
@@ -0,0 +1,174 @@
1
+ import { Readability } from "@mozilla/readability";
2
+ import TurndownService from "turndown";
3
+ function isHtmlContentType(contentType) {
4
+ const ct = contentType.split(";")[0].trim().toLowerCase();
5
+ return ct === "text/html" || ct === "application/xhtml+xml";
6
+ }
7
+ function isTextContentType(contentType) {
8
+ const ct = contentType.split(";")[0].trim().toLowerCase();
9
+ if (ct.startsWith("text/"))
10
+ return true;
11
+ return (ct === "application/json" ||
12
+ ct === "application/xml" ||
13
+ ct === "application/javascript");
14
+ }
15
+ function getApiKey(context, providerId) {
16
+ return context.apiKeys?.[providerId];
17
+ }
18
+ async function fetchWithProxy(url, proxyUrl, init) {
19
+ if (proxyUrl) {
20
+ try {
21
+ return await fetch(`${proxyUrl}/?url=${encodeURIComponent(url)}`, init);
22
+ }
23
+ catch (err) {
24
+ throw new Error(`CORS proxy fetch failed: ${err instanceof Error ? err.message : err}`);
25
+ }
26
+ }
27
+ try {
28
+ return await fetch(url, init);
29
+ }
30
+ catch {
31
+ throw new Error("Fetch blocked by CORS and no CORS proxy is configured. Enable the CORS proxy in Settings.");
32
+ }
33
+ }
34
+ function extractContentFromHtml(url, html) {
35
+ const doc = new DOMParser().parseFromString(html, "text/html");
36
+ const base = doc.createElement("base");
37
+ base.href = url;
38
+ doc.head.prepend(base);
39
+ const reader = new Readability(doc);
40
+ const article = reader.parse();
41
+ const td = new TurndownService({
42
+ headingStyle: "atx",
43
+ codeBlockStyle: "fenced",
44
+ bulletListMarker: "-",
45
+ });
46
+ td.remove(["script", "style", "footer"]);
47
+ let title;
48
+ let content;
49
+ const metadata = { URL: url };
50
+ if (article) {
51
+ title = article.title;
52
+ if (article.byline)
53
+ metadata.Author = article.byline;
54
+ if (article.siteName)
55
+ metadata.Site = article.siteName;
56
+ content = td.turndown(article.content).trim();
57
+ }
58
+ else {
59
+ title = doc.querySelector("title")?.textContent ?? url;
60
+ content = td.turndown(doc.body?.innerHTML ?? "").trim();
61
+ }
62
+ return {
63
+ kind: "text",
64
+ contentType: "text/markdown",
65
+ text: content,
66
+ title,
67
+ metadata,
68
+ };
69
+ }
70
+ const basicFetchProvider = {
71
+ id: "basic",
72
+ async fetch(url, context) {
73
+ const resp = await fetchWithProxy(url, context.proxyUrl);
74
+ if (!resp.ok) {
75
+ throw new Error(`Fetch failed: ${resp.status} ${resp.statusText}`);
76
+ }
77
+ const contentType = resp.headers.get("content-type") ?? "";
78
+ if (isHtmlContentType(contentType)) {
79
+ return extractContentFromHtml(url, await resp.text());
80
+ }
81
+ if (isTextContentType(contentType)) {
82
+ return {
83
+ kind: "text",
84
+ contentType,
85
+ text: await resp.text(),
86
+ };
87
+ }
88
+ return {
89
+ kind: "binary",
90
+ contentType,
91
+ data: new Uint8Array(await resp.arrayBuffer()),
92
+ };
93
+ },
94
+ };
95
+ function toExaTextResult(inputUrl, response) {
96
+ const first = response.results?.[0];
97
+ if (!first)
98
+ return null;
99
+ const text = first.text?.trim() ||
100
+ first.summary?.trim() ||
101
+ first.highlights?.filter(Boolean).join("\n\n").trim() ||
102
+ "";
103
+ if (!text)
104
+ return null;
105
+ const metadata = {
106
+ URL: first.url || inputUrl,
107
+ };
108
+ if (first.author)
109
+ metadata.Author = first.author;
110
+ if (first.publishedDate)
111
+ metadata.Published = first.publishedDate;
112
+ if (response.requestId)
113
+ metadata.ExaRequestId = response.requestId;
114
+ if (first.id)
115
+ metadata.ExaId = first.id;
116
+ return {
117
+ kind: "text",
118
+ contentType: "text/markdown",
119
+ title: first.title || first.url || inputUrl,
120
+ text,
121
+ metadata,
122
+ };
123
+ }
124
+ const exaFetchProvider = {
125
+ id: "exa",
126
+ requiresApiKey: true,
127
+ async fetch(url, context) {
128
+ const apiKey = getApiKey(context, "exa");
129
+ if (!apiKey) {
130
+ throw new Error("Exa fetch requires an API key. Configure it in Settings > Web > API Keys.");
131
+ }
132
+ const endpoint = "https://api.exa.ai/contents";
133
+ const body = {
134
+ urls: [url],
135
+ text: true,
136
+ };
137
+ const resp = await fetchWithProxy(endpoint, context.proxyUrl, {
138
+ method: "POST",
139
+ headers: {
140
+ "Content-Type": "application/json",
141
+ "x-api-key": apiKey,
142
+ },
143
+ body: JSON.stringify(body),
144
+ });
145
+ if (resp.ok) {
146
+ const json = (await resp.json());
147
+ const parsed = toExaTextResult(url, json);
148
+ if (parsed)
149
+ return parsed;
150
+ return basicFetchProvider.fetch(url, context);
151
+ }
152
+ if (resp.status === 401 || resp.status === 403) {
153
+ throw new Error(`Exa fetch failed: ${resp.status} ${resp.statusText}`);
154
+ }
155
+ return basicFetchProvider.fetch(url, context);
156
+ },
157
+ };
158
+ const PROVIDERS = {
159
+ basic: basicFetchProvider,
160
+ exa: exaFetchProvider,
161
+ };
162
+ export function listFetchProviders() {
163
+ return Object.keys(PROVIDERS);
164
+ }
165
+ export function getFetchProvider(providerId) {
166
+ if (!providerId)
167
+ return basicFetchProvider;
168
+ return PROVIDERS[providerId] || basicFetchProvider;
169
+ }
170
+ export async function fetchWeb(url, context = {}, providerId) {
171
+ const provider = getFetchProvider(providerId);
172
+ return provider.fetch(url, context);
173
+ }
174
+ //# sourceMappingURL=fetch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fetch.js","sourceRoot":"","sources":["../../src/web/fetch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ImageSearchOptions, ImageSearchResult, SearchOptions, SearchProvider, SearchResult, WebContext } from "./types";
2
+ export declare function listSearchProviders(): {
3
+ id: string;
4
+ label: string;
5
+ }[];
6
+ export declare function getSearchProvider(providerId?: string): SearchProvider;
7
+ export declare function searchWeb(query: string, options?: SearchOptions, context?: WebContext, providerId?: string): Promise<SearchResult[]>;
8
+ export declare function searchImages(query: string, options?: ImageSearchOptions, context?: WebContext): Promise<ImageSearchResult[]>;
9
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/web/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,YAAY,EACZ,UAAU,EACX,MAAM,SAAS,CAAC;AA2PjB,wBAAgB,mBAAmB,IAAI;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAKrE;AAED,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAGrE;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,aAAkB,EAC3B,OAAO,GAAE,UAAe,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,YAAY,EAAE,CAAC,CAGzB;AAED,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,kBAAuB,EAChC,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAkE9B"}
@@ -0,0 +1,238 @@
1
+ function parseHTML(html) {
2
+ return new DOMParser().parseFromString(html, "text/html");
3
+ }
4
+ function textOf(el) {
5
+ return (el?.textContent ?? "").replace(/\s+/g, " ").trim();
6
+ }
7
+ function getApiKey(context, providerId) {
8
+ return context.apiKeys?.[providerId];
9
+ }
10
+ async function fetchWithProxy(url, context, init) {
11
+ if (context.proxyUrl) {
12
+ try {
13
+ return await fetch(`${context.proxyUrl}/?url=${encodeURIComponent(url)}`, init);
14
+ }
15
+ catch (err) {
16
+ throw new Error(`CORS proxy search failed: ${err instanceof Error ? err.message : String(err)}`);
17
+ }
18
+ }
19
+ try {
20
+ return await fetch(url, init);
21
+ }
22
+ catch {
23
+ throw new Error("Search blocked by CORS and no CORS proxy is configured. Enable the CORS proxy in Settings.");
24
+ }
25
+ }
26
+ const ddgsProvider = {
27
+ id: "ddgs",
28
+ async search(query, options, context) {
29
+ const { region = "us-en", timelimit, maxResults = 10, page = 1 } = options;
30
+ const body = new URLSearchParams({ q: query, l: region, b: "" });
31
+ if (page > 1)
32
+ body.set("s", String(10 + (page - 2) * 15));
33
+ if (timelimit)
34
+ body.set("df", timelimit);
35
+ const target = "https://html.duckduckgo.com/html/";
36
+ const resp = await fetchWithProxy(target, context, {
37
+ method: "POST",
38
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
39
+ body: body.toString(),
40
+ });
41
+ if (!resp.ok)
42
+ throw new Error(`Search failed: ${resp.status}`);
43
+ const doc = parseHTML(await resp.text());
44
+ if (doc.querySelector(".anomaly-modal, #challenge-form")) {
45
+ throw new Error("DuckDuckGo is rate-limiting requests (bot challenge). Try again later or use a different CORS proxy.");
46
+ }
47
+ const results = [];
48
+ for (const item of doc.querySelectorAll(".result")) {
49
+ const titleEl = item.querySelector(".result__title a, .result__a");
50
+ const bodyEl = item.querySelector(".result__snippet");
51
+ let href = titleEl?.getAttribute("href") ?? "";
52
+ if (!href || href.includes("duckduckgo.com/y.js"))
53
+ continue;
54
+ if (href.startsWith("//"))
55
+ href = `https:${href}`;
56
+ results.push({
57
+ title: textOf(titleEl),
58
+ href,
59
+ body: textOf(bodyEl),
60
+ });
61
+ if (results.length >= maxResults)
62
+ break;
63
+ }
64
+ return results;
65
+ },
66
+ };
67
+ const braveProvider = {
68
+ id: "brave",
69
+ requiresApiKey: true,
70
+ async search(query, options, context) {
71
+ const apiKey = getApiKey(context, "brave");
72
+ if (!apiKey) {
73
+ throw new Error("Brave search requires an API key. Configure it in Settings > Web > API Keys.");
74
+ }
75
+ const maxResults = options.maxResults ?? 10;
76
+ const offset = ((options.page ?? 1) - 1) * maxResults;
77
+ const country = options.region?.split("-")[0]?.toUpperCase() || "US";
78
+ const url = new URL("https://api.search.brave.com/res/v1/web/search");
79
+ url.searchParams.set("q", query);
80
+ url.searchParams.set("count", String(maxResults));
81
+ url.searchParams.set("offset", String(offset));
82
+ url.searchParams.set("country", country);
83
+ const resp = await fetchWithProxy(url.toString(), context, {
84
+ headers: {
85
+ Accept: "application/json",
86
+ "X-Subscription-Token": apiKey,
87
+ },
88
+ });
89
+ if (!resp.ok) {
90
+ throw new Error(`Brave search failed: ${resp.status} ${resp.statusText}`);
91
+ }
92
+ const data = (await resp.json());
93
+ return (data.web?.results || []).map((r) => ({
94
+ title: r.title || "",
95
+ href: r.url || "",
96
+ body: r.description || "",
97
+ }));
98
+ },
99
+ };
100
+ const serperProvider = {
101
+ id: "serper",
102
+ requiresApiKey: true,
103
+ async search(query, options, context) {
104
+ const apiKey = getApiKey(context, "serper");
105
+ if (!apiKey) {
106
+ throw new Error("Serper search requires an API key. Configure it in Settings > Web > API Keys.");
107
+ }
108
+ const [countryRaw, languageRaw] = (options.region || "us-en").split("-");
109
+ const country = countryRaw?.toLowerCase() || "us";
110
+ const language = languageRaw?.toLowerCase() || "en";
111
+ const body = {
112
+ q: query,
113
+ num: options.maxResults ?? 10,
114
+ page: options.page ?? 1,
115
+ gl: country,
116
+ hl: language,
117
+ };
118
+ if (options.timelimit)
119
+ body.tbs = `qdr:${options.timelimit}`;
120
+ const endpoint = "https://google.serper.dev/search";
121
+ const resp = await fetchWithProxy(endpoint, context, {
122
+ method: "POST",
123
+ headers: {
124
+ "Content-Type": "application/json",
125
+ "X-API-KEY": apiKey,
126
+ },
127
+ body: JSON.stringify(body),
128
+ });
129
+ if (!resp.ok) {
130
+ throw new Error(`Serper search failed: ${resp.status} ${resp.statusText}`);
131
+ }
132
+ const data = (await resp.json());
133
+ return (data.organic || []).map((r) => ({
134
+ title: r.title || "",
135
+ href: r.link || "",
136
+ body: r.snippet || "",
137
+ }));
138
+ },
139
+ };
140
+ const exaProvider = {
141
+ id: "exa",
142
+ requiresApiKey: true,
143
+ async search(query, options, context) {
144
+ const apiKey = getApiKey(context, "exa");
145
+ if (!apiKey) {
146
+ throw new Error("Exa search requires an API key. Configure it in Settings > Web > API Keys.");
147
+ }
148
+ const body = {
149
+ query,
150
+ numResults: options.maxResults ?? 10,
151
+ type: "auto",
152
+ };
153
+ const targetUrl = "https://api.exa.ai/search";
154
+ const resp = await fetchWithProxy(targetUrl, context, {
155
+ method: "POST",
156
+ headers: {
157
+ "Content-Type": "application/json",
158
+ "x-api-key": apiKey,
159
+ },
160
+ body: JSON.stringify(body),
161
+ });
162
+ if (!resp.ok) {
163
+ throw new Error(`Exa search failed: ${resp.status} ${resp.statusText}`);
164
+ }
165
+ const data = (await resp.json());
166
+ return (data.results || []).map((r) => ({
167
+ title: r.title || "",
168
+ href: r.url || "",
169
+ body: r.text || "",
170
+ }));
171
+ },
172
+ };
173
+ const PROVIDERS = {
174
+ ddgs: ddgsProvider,
175
+ brave: braveProvider,
176
+ serper: serperProvider,
177
+ exa: exaProvider,
178
+ };
179
+ const PROVIDER_LABELS = {
180
+ ddgs: "ddgs (free, easily rate limited)",
181
+ };
182
+ export function listSearchProviders() {
183
+ return Object.keys(PROVIDERS).map((id) => ({
184
+ id,
185
+ label: PROVIDER_LABELS[id] ?? id,
186
+ }));
187
+ }
188
+ export function getSearchProvider(providerId) {
189
+ if (!providerId)
190
+ return ddgsProvider;
191
+ return PROVIDERS[providerId] || ddgsProvider;
192
+ }
193
+ export async function searchWeb(query, options = {}, context = {}, providerId) {
194
+ const provider = getSearchProvider(providerId);
195
+ return provider.search(query, options, context);
196
+ }
197
+ export async function searchImages(query, options = {}, context = {}) {
198
+ const apiKey = getApiKey(context, "serper");
199
+ if (!apiKey) {
200
+ throw new Error("Image search requires a Serper API key. Configure it in Settings > Web > API Keys.");
201
+ }
202
+ const body = { q: query };
203
+ if (options.num)
204
+ body.num = options.num;
205
+ if (options.page)
206
+ body.page = options.page;
207
+ if (options.gl)
208
+ body.gl = options.gl;
209
+ if (options.hl)
210
+ body.hl = options.hl;
211
+ const endpoint = "https://google.serper.dev/images";
212
+ const resp = await fetchWithProxy(endpoint, context, {
213
+ method: "POST",
214
+ headers: {
215
+ "Content-Type": "application/json",
216
+ "X-API-KEY": apiKey,
217
+ },
218
+ body: JSON.stringify(body),
219
+ });
220
+ if (!resp.ok) {
221
+ throw new Error(`Serper image search failed: ${resp.status} ${resp.statusText}`);
222
+ }
223
+ const data = (await resp.json());
224
+ return (data.images || []).map((img, i) => ({
225
+ title: img.title || "",
226
+ imageUrl: img.imageUrl || "",
227
+ imageWidth: img.imageWidth || 0,
228
+ imageHeight: img.imageHeight || 0,
229
+ thumbnailUrl: img.thumbnailUrl || "",
230
+ thumbnailWidth: img.thumbnailWidth || 0,
231
+ thumbnailHeight: img.thumbnailHeight || 0,
232
+ source: img.source || "",
233
+ domain: img.domain || "",
234
+ link: img.link || "",
235
+ position: img.position || i + 1,
236
+ }));
237
+ }
238
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/web/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ export interface SearchResult {
2
+ title: string;
3
+ href: string;
4
+ body: string;
5
+ }
6
+ export interface SearchOptions {
7
+ region?: string;
8
+ timelimit?: "d" | "w" | "m" | "y";
9
+ maxResults?: number;
10
+ page?: number;
11
+ }
12
+ export interface WebContext {
13
+ proxyUrl?: string;
14
+ apiKeys?: Record<string, string | undefined>;
15
+ }
16
+ export interface SearchProvider {
17
+ id: string;
18
+ requiresApiKey?: boolean;
19
+ search: (query: string, options: SearchOptions, context: WebContext) => Promise<SearchResult[]>;
20
+ }
21
+ export type FetchResult = {
22
+ kind: "text";
23
+ contentType: string;
24
+ text: string;
25
+ title?: string;
26
+ metadata?: Record<string, string>;
27
+ } | {
28
+ kind: "binary";
29
+ contentType: string;
30
+ data: Uint8Array;
31
+ };
32
+ export interface ImageSearchResult {
33
+ title: string;
34
+ imageUrl: string;
35
+ imageWidth: number;
36
+ imageHeight: number;
37
+ thumbnailUrl: string;
38
+ thumbnailWidth: number;
39
+ thumbnailHeight: number;
40
+ source: string;
41
+ domain: string;
42
+ link: string;
43
+ position: number;
44
+ }
45
+ export interface ImageSearchOptions {
46
+ num?: number;
47
+ page?: number;
48
+ gl?: string;
49
+ hl?: string;
50
+ }
51
+ export interface FetchProvider {
52
+ id: string;
53
+ requiresApiKey?: boolean;
54
+ fetch: (url: string, context: WebContext) => Promise<FetchResult>;
55
+ }
56
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/web/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,MAAM,EAAE,CACN,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,UAAU,KAChB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;CAC9B;AAED,MAAM,MAAM,WAAW,GACnB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC,GACD;IACE,IAAI,EAAE,QAAQ,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;CAClB,CAAC;AAEN,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,EAAE,CAAC,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CACnE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/web/types.ts"],"names":[],"mappings":""}
package/package.json ADDED
@@ -0,0 +1,47 @@
1
+ {
2
+ "name": "@office-agents/sdk",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "description": "Headless SDK for Office Agents — agent runtime, tools, storage, VFS, skills, OAuth, and provider config for building AI-powered Office Add-ins",
6
+ "license": "MIT",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "dependencies": {
19
+ "@mariozechner/pi-agent-core": "^0.54.0",
20
+ "@mariozechner/pi-ai": "^0.54.0",
21
+ "@mozilla/readability": "^0.6.0",
22
+ "@sinclair/typebox": "^0.34.48",
23
+ "@types/turndown": "^5.0.6",
24
+ "idb": "^8.0.3",
25
+ "just-bash": "^2.7.0",
26
+ "mammoth": "^1.11.0",
27
+ "pdfjs-dist": "^5.4.624",
28
+ "ses": "^1.14.0",
29
+ "turndown": "^7.2.2",
30
+ "xlsx": "^0.18.5"
31
+ },
32
+ "peerDependencies": {
33
+ "@types/office-js": ">=1.0.0"
34
+ },
35
+ "peerDependenciesMeta": {
36
+ "@types/office-js": {
37
+ "optional": true
38
+ }
39
+ },
40
+ "devDependencies": {
41
+ "@types/office-js": "^1.0.377"
42
+ },
43
+ "scripts": {
44
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
45
+ "clean": "rm -rf dist"
46
+ }
47
+ }