@oharness/engine 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 (256) hide show
  1. package/dist/agent/agent.d.ts +196 -0
  2. package/dist/agent/agent.js +758 -0
  3. package/dist/agent/agent.js.map +1 -0
  4. package/dist/agent/compaction.d.ts +68 -0
  5. package/dist/agent/compaction.js +179 -0
  6. package/dist/agent/compaction.js.map +1 -0
  7. package/dist/agent/hooks.d.ts +77 -0
  8. package/dist/agent/hooks.js +152 -0
  9. package/dist/agent/hooks.js.map +1 -0
  10. package/dist/agent/memory.d.ts +45 -0
  11. package/dist/agent/memory.js +147 -0
  12. package/dist/agent/memory.js.map +1 -0
  13. package/dist/agent/overflow.d.ts +35 -0
  14. package/dist/agent/overflow.js +69 -0
  15. package/dist/agent/overflow.js.map +1 -0
  16. package/dist/agent/permissions.d.ts +181 -0
  17. package/dist/agent/permissions.js +289 -0
  18. package/dist/agent/permissions.js.map +1 -0
  19. package/dist/agent/prompt.d.ts +25 -0
  20. package/dist/agent/prompt.js +63 -0
  21. package/dist/agent/prompt.js.map +1 -0
  22. package/dist/agent/session.d.ts +108 -0
  23. package/dist/agent/session.js +231 -0
  24. package/dist/agent/session.js.map +1 -0
  25. package/dist/agent/settings.d.ts +37 -0
  26. package/dist/agent/settings.js +113 -0
  27. package/dist/agent/settings.js.map +1 -0
  28. package/dist/agent/skills.d.ts +58 -0
  29. package/dist/agent/skills.js +225 -0
  30. package/dist/agent/skills.js.map +1 -0
  31. package/dist/agent/store.d.ts +308 -0
  32. package/dist/agent/store.js +596 -0
  33. package/dist/agent/store.js.map +1 -0
  34. package/dist/agent/subagent.d.ts +44 -0
  35. package/dist/agent/subagent.js +138 -0
  36. package/dist/agent/subagent.js.map +1 -0
  37. package/dist/agent/titles.d.ts +8 -0
  38. package/dist/agent/titles.js +23 -0
  39. package/dist/agent/titles.js.map +1 -0
  40. package/dist/agent/workspace.d.ts +60 -0
  41. package/dist/agent/workspace.js +156 -0
  42. package/dist/agent/workspace.js.map +1 -0
  43. package/dist/artifacts/publish.d.ts +94 -0
  44. package/dist/artifacts/publish.js +104 -0
  45. package/dist/artifacts/publish.js.map +1 -0
  46. package/dist/artifacts/store.d.ts +324 -0
  47. package/dist/artifacts/store.js +500 -0
  48. package/dist/artifacts/store.js.map +1 -0
  49. package/dist/auth/index.d.ts +13 -0
  50. package/dist/auth/index.js +10 -0
  51. package/dist/auth/index.js.map +1 -0
  52. package/dist/auth/manager.d.ts +83 -0
  53. package/dist/auth/manager.js +266 -0
  54. package/dist/auth/manager.js.map +1 -0
  55. package/dist/auth/oauth.d.ts +83 -0
  56. package/dist/auth/oauth.js +327 -0
  57. package/dist/auth/oauth.js.map +1 -0
  58. package/dist/auth/providers/account.d.ts +59 -0
  59. package/dist/auth/providers/account.js +282 -0
  60. package/dist/auth/providers/account.js.map +1 -0
  61. package/dist/auth/providers/anthropic.d.ts +24 -0
  62. package/dist/auth/providers/anthropic.js +209 -0
  63. package/dist/auth/providers/anthropic.js.map +1 -0
  64. package/dist/auth/providers/generic.d.ts +57 -0
  65. package/dist/auth/providers/generic.js +155 -0
  66. package/dist/auth/providers/generic.js.map +1 -0
  67. package/dist/auth/providers/official.d.ts +3 -0
  68. package/dist/auth/providers/official.js +90 -0
  69. package/dist/auth/providers/official.js.map +1 -0
  70. package/dist/auth/providers/ottoport.d.ts +3 -0
  71. package/dist/auth/providers/ottoport.js +60 -0
  72. package/dist/auth/providers/ottoport.js.map +1 -0
  73. package/dist/auth/store.d.ts +22 -0
  74. package/dist/auth/store.js +138 -0
  75. package/dist/auth/store.js.map +1 -0
  76. package/dist/auth/types.d.ts +167 -0
  77. package/dist/auth/types.js +16 -0
  78. package/dist/auth/types.js.map +1 -0
  79. package/dist/config.d.ts +197 -0
  80. package/dist/config.js +195 -0
  81. package/dist/config.js.map +1 -0
  82. package/dist/core/errors.d.ts +46 -0
  83. package/dist/core/errors.js +83 -0
  84. package/dist/core/errors.js.map +1 -0
  85. package/dist/core/tokens.d.ts +12 -0
  86. package/dist/core/tokens.js +56 -0
  87. package/dist/core/tokens.js.map +1 -0
  88. package/dist/core/types.d.ts +91 -0
  89. package/dist/core/types.js +49 -0
  90. package/dist/core/types.js.map +1 -0
  91. package/dist/harness.d.ts +302 -0
  92. package/dist/harness.js +695 -0
  93. package/dist/harness.js.map +1 -0
  94. package/dist/index.d.ts +32 -0
  95. package/dist/index.js +21 -0
  96. package/dist/index.js.map +1 -0
  97. package/dist/mcp/client.d.ts +55 -0
  98. package/dist/mcp/client.js +199 -0
  99. package/dist/mcp/client.js.map +1 -0
  100. package/dist/mcp/index.d.ts +13 -0
  101. package/dist/mcp/index.js +8 -0
  102. package/dist/mcp/index.js.map +1 -0
  103. package/dist/mcp/manager.d.ts +77 -0
  104. package/dist/mcp/manager.js +325 -0
  105. package/dist/mcp/manager.js.map +1 -0
  106. package/dist/mcp/oauth.d.ts +63 -0
  107. package/dist/mcp/oauth.js +302 -0
  108. package/dist/mcp/oauth.js.map +1 -0
  109. package/dist/mcp/protocol.d.ts +130 -0
  110. package/dist/mcp/protocol.js +14 -0
  111. package/dist/mcp/protocol.js.map +1 -0
  112. package/dist/mcp/registry.d.ts +52 -0
  113. package/dist/mcp/registry.js +100 -0
  114. package/dist/mcp/registry.js.map +1 -0
  115. package/dist/mcp/registry.json +293 -0
  116. package/dist/mcp/secrets.d.ts +20 -0
  117. package/dist/mcp/secrets.js +75 -0
  118. package/dist/mcp/secrets.js.map +1 -0
  119. package/dist/mcp/transport.d.ts +51 -0
  120. package/dist/mcp/transport.js +158 -0
  121. package/dist/mcp/transport.js.map +1 -0
  122. package/dist/paths.d.ts +37 -0
  123. package/dist/paths.js +63 -0
  124. package/dist/paths.js.map +1 -0
  125. package/dist/plugins.d.ts +55 -0
  126. package/dist/plugins.js +201 -0
  127. package/dist/plugins.js.map +1 -0
  128. package/dist/providers/builtin.d.ts +23 -0
  129. package/dist/providers/builtin.js +141 -0
  130. package/dist/providers/builtin.js.map +1 -0
  131. package/dist/providers/catalog.d.ts +129 -0
  132. package/dist/providers/catalog.js +254 -0
  133. package/dist/providers/catalog.js.map +1 -0
  134. package/dist/providers/catalog.json +472 -0
  135. package/dist/providers/discovery.d.ts +16 -0
  136. package/dist/providers/discovery.js +161 -0
  137. package/dist/providers/discovery.js.map +1 -0
  138. package/dist/providers/http.d.ts +24 -0
  139. package/dist/providers/http.js +139 -0
  140. package/dist/providers/http.js.map +1 -0
  141. package/dist/providers/index.d.ts +10 -0
  142. package/dist/providers/index.js +8 -0
  143. package/dist/providers/index.js.map +1 -0
  144. package/dist/providers/piai.d.ts +124 -0
  145. package/dist/providers/piai.js +551 -0
  146. package/dist/providers/piai.js.map +1 -0
  147. package/dist/providers/registry.d.ts +65 -0
  148. package/dist/providers/registry.js +195 -0
  149. package/dist/providers/registry.js.map +1 -0
  150. package/dist/providers/resilient.d.ts +46 -0
  151. package/dist/providers/resilient.js +117 -0
  152. package/dist/providers/resilient.js.map +1 -0
  153. package/dist/providers/types.d.ts +182 -0
  154. package/dist/providers/types.js +50 -0
  155. package/dist/providers/types.js.map +1 -0
  156. package/dist/schedule/cron.d.ts +35 -0
  157. package/dist/schedule/cron.js +125 -0
  158. package/dist/schedule/cron.js.map +1 -0
  159. package/dist/schedule/scheduler.d.ts +87 -0
  160. package/dist/schedule/scheduler.js +237 -0
  161. package/dist/schedule/scheduler.js.map +1 -0
  162. package/dist/storage/kv.d.ts +56 -0
  163. package/dist/storage/kv.js +173 -0
  164. package/dist/storage/kv.js.map +1 -0
  165. package/dist/storage/migrate.d.ts +11 -0
  166. package/dist/storage/migrate.js +93 -0
  167. package/dist/storage/migrate.js.map +1 -0
  168. package/dist/storage/project.d.ts +9 -0
  169. package/dist/storage/project.js +57 -0
  170. package/dist/storage/project.js.map +1 -0
  171. package/dist/storage/records.d.ts +32 -0
  172. package/dist/storage/records.js +48 -0
  173. package/dist/storage/records.js.map +1 -0
  174. package/dist/sync/client.d.ts +79 -0
  175. package/dist/sync/client.js +118 -0
  176. package/dist/sync/client.js.map +1 -0
  177. package/dist/sync/mirror.d.ts +85 -0
  178. package/dist/sync/mirror.js +389 -0
  179. package/dist/sync/mirror.js.map +1 -0
  180. package/dist/sync/protocol.d.ts +67 -0
  181. package/dist/sync/protocol.js +16 -0
  182. package/dist/sync/protocol.js.map +1 -0
  183. package/dist/sync/settings.d.ts +56 -0
  184. package/dist/sync/settings.js +60 -0
  185. package/dist/sync/settings.js.map +1 -0
  186. package/dist/tools/builtin/artifact.d.ts +16 -0
  187. package/dist/tools/builtin/artifact.js +134 -0
  188. package/dist/tools/builtin/artifact.js.map +1 -0
  189. package/dist/tools/builtin/bash.d.ts +3 -0
  190. package/dist/tools/builtin/bash.js +142 -0
  191. package/dist/tools/builtin/bash.js.map +1 -0
  192. package/dist/tools/builtin/fs.d.ts +19 -0
  193. package/dist/tools/builtin/fs.js +280 -0
  194. package/dist/tools/builtin/fs.js.map +1 -0
  195. package/dist/tools/builtin/index.d.ts +22 -0
  196. package/dist/tools/builtin/index.js +42 -0
  197. package/dist/tools/builtin/index.js.map +1 -0
  198. package/dist/tools/builtin/mcp-resource.d.ts +3 -0
  199. package/dist/tools/builtin/mcp-resource.js +220 -0
  200. package/dist/tools/builtin/mcp-resource.js.map +1 -0
  201. package/dist/tools/builtin/memory.d.ts +10 -0
  202. package/dist/tools/builtin/memory.js +76 -0
  203. package/dist/tools/builtin/memory.js.map +1 -0
  204. package/dist/tools/builtin/recall.d.ts +13 -0
  205. package/dist/tools/builtin/recall.js +163 -0
  206. package/dist/tools/builtin/recall.js.map +1 -0
  207. package/dist/tools/builtin/search.d.ts +3 -0
  208. package/dist/tools/builtin/search.js +240 -0
  209. package/dist/tools/builtin/search.js.map +1 -0
  210. package/dist/tools/builtin/skill.d.ts +10 -0
  211. package/dist/tools/builtin/skill.js +46 -0
  212. package/dist/tools/builtin/skill.js.map +1 -0
  213. package/dist/tools/builtin/task.d.ts +9 -0
  214. package/dist/tools/builtin/task.js +68 -0
  215. package/dist/tools/builtin/task.js.map +1 -0
  216. package/dist/tools/builtin/todo.d.ts +20 -0
  217. package/dist/tools/builtin/todo.js +63 -0
  218. package/dist/tools/builtin/todo.js.map +1 -0
  219. package/dist/tools/define.d.ts +19 -0
  220. package/dist/tools/define.js +39 -0
  221. package/dist/tools/define.js.map +1 -0
  222. package/dist/tools/index.d.ts +7 -0
  223. package/dist/tools/index.js +5 -0
  224. package/dist/tools/index.js.map +1 -0
  225. package/dist/tools/registry.d.ts +39 -0
  226. package/dist/tools/registry.js +101 -0
  227. package/dist/tools/registry.js.map +1 -0
  228. package/dist/tools/types.d.ts +112 -0
  229. package/dist/tools/types.js +22 -0
  230. package/dist/tools/types.js.map +1 -0
  231. package/dist/util/id.d.ts +9 -0
  232. package/dist/util/id.js +19 -0
  233. package/dist/util/id.js.map +1 -0
  234. package/dist/util/json.d.ts +25 -0
  235. package/dist/util/json.js +100 -0
  236. package/dist/util/json.js.map +1 -0
  237. package/dist/util/jwt.d.ts +74 -0
  238. package/dist/util/jwt.js +177 -0
  239. package/dist/util/jwt.js.map +1 -0
  240. package/dist/util/logger.d.ts +13 -0
  241. package/dist/util/logger.js +59 -0
  242. package/dist/util/logger.js.map +1 -0
  243. package/dist/util/queue.d.ts +26 -0
  244. package/dist/util/queue.js +106 -0
  245. package/dist/util/queue.js.map +1 -0
  246. package/dist/util/schema.d.ts +17 -0
  247. package/dist/util/schema.js +98 -0
  248. package/dist/util/schema.js.map +1 -0
  249. package/dist/util/shell.d.ts +20 -0
  250. package/dist/util/shell.js +24 -0
  251. package/dist/util/shell.js.map +1 -0
  252. package/official.json +4 -0
  253. package/package.json +38 -0
  254. package/skills/artifact-authoring/SKILL.md +81 -0
  255. package/skills/canvas/SKILL.md +85 -0
  256. package/skills/skill-authoring/SKILL.md +85 -0
@@ -0,0 +1,24 @@
1
+ export interface SseEvent {
2
+ event?: string;
3
+ data: string;
4
+ }
5
+ /**
6
+ * Parse a `text/event-stream` body into events. Handles multi-line `data:`
7
+ * fields and CRLF, and tolerates servers that omit the trailing blank line.
8
+ */
9
+ export declare function parseSse(body: ReadableStream<Uint8Array>): AsyncGenerator<SseEvent, void, void>;
10
+ export interface PostOptions {
11
+ url: string;
12
+ headers: Record<string, string>;
13
+ body: unknown;
14
+ signal?: AbortSignal;
15
+ timeoutMs?: number;
16
+ maxRetries?: number;
17
+ provider: string;
18
+ }
19
+ /**
20
+ * POST JSON and return the raw response, retrying retryable statuses with
21
+ * exponential backoff + jitter. Honors `retry-after` when present.
22
+ */
23
+ export declare function postJson(opts: PostOptions): Promise<Response>;
24
+ export declare function streamBody(response: Response, provider: string): Promise<ReadableStream<Uint8Array>>;
@@ -0,0 +1,139 @@
1
+ import { ProviderError, isRetryableStatus } from "../core/errors.js";
2
+ /**
3
+ * Parse a `text/event-stream` body into events. Handles multi-line `data:`
4
+ * fields and CRLF, and tolerates servers that omit the trailing blank line.
5
+ */
6
+ export async function* parseSse(body) {
7
+ const decoder = new TextDecoder();
8
+ const reader = body.getReader();
9
+ let buffer = "";
10
+ try {
11
+ while (true) {
12
+ const { done, value } = await reader.read();
13
+ if (done)
14
+ break;
15
+ buffer += decoder.decode(value, { stream: true });
16
+ buffer = buffer.replaceAll("\r\n", "\n");
17
+ let idx;
18
+ while ((idx = buffer.indexOf("\n\n")) !== -1) {
19
+ const chunk = buffer.slice(0, idx);
20
+ buffer = buffer.slice(idx + 2);
21
+ const parsed = parseChunk(chunk);
22
+ if (parsed)
23
+ yield parsed;
24
+ }
25
+ }
26
+ const tail = parseChunk(buffer);
27
+ if (tail)
28
+ yield tail;
29
+ }
30
+ finally {
31
+ reader.releaseLock();
32
+ }
33
+ }
34
+ function parseChunk(chunk) {
35
+ let event;
36
+ const dataLines = [];
37
+ for (const line of chunk.split("\n")) {
38
+ if (line === "" || line.startsWith(":"))
39
+ continue;
40
+ const colon = line.indexOf(":");
41
+ const field = colon === -1 ? line : line.slice(0, colon);
42
+ let value = colon === -1 ? "" : line.slice(colon + 1);
43
+ if (value.startsWith(" "))
44
+ value = value.slice(1);
45
+ if (field === "event")
46
+ event = value;
47
+ else if (field === "data")
48
+ dataLines.push(value);
49
+ }
50
+ if (dataLines.length === 0)
51
+ return undefined;
52
+ return { event, data: dataLines.join("\n") };
53
+ }
54
+ /**
55
+ * POST JSON and return the raw response, retrying retryable statuses with
56
+ * exponential backoff + jitter. Honors `retry-after` when present.
57
+ */
58
+ export async function postJson(opts) {
59
+ const maxRetries = opts.maxRetries ?? 2;
60
+ let lastError;
61
+ for (let attempt = 0; attempt <= maxRetries; attempt++) {
62
+ const timeout = AbortSignal.timeout(opts.timeoutMs ?? 600_000);
63
+ const signal = opts.signal
64
+ ? AbortSignal.any([opts.signal, timeout])
65
+ : timeout;
66
+ let response;
67
+ try {
68
+ response = await fetch(opts.url, {
69
+ method: "POST",
70
+ headers: { "content-type": "application/json", ...opts.headers },
71
+ body: JSON.stringify(opts.body),
72
+ signal,
73
+ });
74
+ }
75
+ catch (err) {
76
+ // A caller-initiated abort is final; anything else may be transient.
77
+ if (opts.signal?.aborted)
78
+ throw err;
79
+ lastError = err;
80
+ if (attempt === maxRetries) {
81
+ throw new ProviderError(opts.provider, `request failed: ${String(err)}`, {
82
+ retryable: true,
83
+ cause: err,
84
+ });
85
+ }
86
+ await sleep(backoffMs(attempt));
87
+ continue;
88
+ }
89
+ if (response.ok)
90
+ return response;
91
+ const detail = await safeText(response);
92
+ if (isRetryableStatus(response.status) && attempt < maxRetries) {
93
+ await sleep(retryAfterMs(response) ?? backoffMs(attempt));
94
+ continue;
95
+ }
96
+ throw new ProviderError(opts.provider, `HTTP ${response.status} ${response.statusText}: ${truncate(detail, 800)}`, { status: response.status });
97
+ }
98
+ throw new ProviderError(opts.provider, `request failed: ${String(lastError)}`, {
99
+ retryable: true,
100
+ cause: lastError,
101
+ });
102
+ }
103
+ export async function streamBody(response, provider) {
104
+ if (!response.body) {
105
+ throw new ProviderError(provider, "response had no body");
106
+ }
107
+ return response.body;
108
+ }
109
+ function backoffMs(attempt) {
110
+ const base = Math.min(1_000 * 2 ** attempt, 16_000);
111
+ return base + Math.random() * 250;
112
+ }
113
+ function retryAfterMs(response) {
114
+ const header = response.headers.get("retry-after");
115
+ if (!header)
116
+ return undefined;
117
+ const seconds = Number(header);
118
+ if (Number.isFinite(seconds))
119
+ return seconds * 1_000;
120
+ const date = Date.parse(header);
121
+ if (Number.isFinite(date))
122
+ return Math.max(0, date - Date.now());
123
+ return undefined;
124
+ }
125
+ function sleep(ms) {
126
+ return new Promise((resolve) => setTimeout(resolve, ms));
127
+ }
128
+ async function safeText(response) {
129
+ try {
130
+ return await response.text();
131
+ }
132
+ catch {
133
+ return "<unreadable body>";
134
+ }
135
+ }
136
+ function truncate(s, n) {
137
+ return s.length > n ? `${s.slice(0, n)}…` : s;
138
+ }
139
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/providers/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { PiAiProvider } from "./piai.ts";
2
+ export type { PiAiProviderOptions, PiApi } from "./piai.ts";
3
+ export { discoverModels } from "./discovery.ts";
4
+ export { ProviderRegistry } from "./registry.ts";
5
+ export { ResilientProvider } from "./resilient.ts";
6
+ export { loadCatalog, mergeCatalog, normalizeModel, parseCatalog, userCatalogPath, } from "./catalog.ts";
7
+ export type { Catalog, CatalogProvider, DiscoveryFormat, ProtocolId } from "./catalog.ts";
8
+ export { estimateCost, resolveEffort } from "./types.ts";
9
+ export type { EffortLevel, GenerateRequest, ModelSpec, Provider, ProviderCredentials, StreamEvent, ThinkingConfig, ToolChoice, } from "./types.ts";
10
+ export { parseSse } from "./http.ts";
@@ -0,0 +1,8 @@
1
+ export { PiAiProvider } from "./piai.js";
2
+ export { discoverModels } from "./discovery.js";
3
+ export { ProviderRegistry } from "./registry.js";
4
+ export { ResilientProvider } from "./resilient.js";
5
+ export { loadCatalog, mergeCatalog, normalizeModel, parseCatalog, userCatalogPath, } from "./catalog.js";
6
+ export { estimateCost, resolveEffort } from "./types.js";
7
+ export { parseSse } from "./http.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAWzD,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,124 @@
1
+ import type { Message as PiMessage } from "@earendil-works/pi-ai";
2
+ import type { Message } from "../core/types.ts";
3
+ import type { DiscoveryFormat, ProtocolId } from "./catalog.ts";
4
+ import type { GenerateRequest, ModelSpec, Provider, ProviderCredentials, StreamEvent } from "./types.ts";
5
+ /**
6
+ * The wire adapter, backed by pi-ai.
7
+ *
8
+ * Every vendor protocol the harness speaks now goes through one of pi-ai's API
9
+ * implementations. What stays here is the translation in both directions:
10
+ * harness types in, harness types out. That boundary is the whole point — the
11
+ * agent loop, session storage and `/model` keep talking about `Message`,
12
+ * `ModelSpec` and `StreamEvent`, so which library drives the socket stays an
13
+ * implementation detail.
14
+ *
15
+ * Auth deliberately does *not* go through pi-ai's provider auth. Credentials
16
+ * here are resolved per request by `AuthManager` — a subscription token valid
17
+ * at startup is not valid an hour later — so the API implementations are
18
+ * called directly and handed the resolved key and headers. pi-ai's own
19
+ * credential store would be a second, competing source of truth.
20
+ */
21
+ /** The pi-ai API implementations the catalog can name. */
22
+ export type PiApi = "anthropic-messages" | "openai-completions" | "openai-responses" | "google-generative-ai" | "google-vertex" | "bedrock-converse-stream";
23
+ /**
24
+ * The pi-ai API implementation behind each catalog protocol.
25
+ *
26
+ * The catalog's names are the harness's own and predate pi-ai; keeping the
27
+ * mapping explicit means a rename upstream is a one-line change here rather
28
+ * than a migration of every user's catalog.json. It lives beside `PiApi`
29
+ * because both the registry (which builds providers) and the builtin seed
30
+ * (which decides whether a pi-ai model can even be driven over a catalog
31
+ * entry's protocol) have to agree on it.
32
+ */
33
+ export declare const PI_APIS: Record<ProtocolId, PiApi>;
34
+ export interface PiAiProviderOptions extends ProviderCredentials {
35
+ id: string;
36
+ name?: string;
37
+ /** Which pi-ai API implementation serves this endpoint. */
38
+ api: PiApi;
39
+ /** Env var consulted when `apiKey` is absent. */
40
+ apiKeyEnv?: string;
41
+ /**
42
+ * Whether this endpoint needs a credential. Local servers (Ollama, vLLM,
43
+ * LM Studio) do not; every hosted vendor does. Defaults to true — claiming a
44
+ * hosted provider is ready without a key produces a 401 at first use.
45
+ */
46
+ requiresKey?: boolean;
47
+ /** Some compatible servers reject `stream_options: {include_usage: true}`. */
48
+ includeUsage?: boolean;
49
+ /** Whether this endpoint requires an `Idempotency-Key` on each request. */
50
+ idempotencyKey?: boolean;
51
+ /** A ceiling the endpoint imposes on `max_tokens`, below what models state. */
52
+ maxOutputTokens?: number;
53
+ /** How to read `/models`; absent means the endpoint is not worth calling. */
54
+ discoveryFormat?: DiscoveryFormat;
55
+ /** Base URL used for discovery and as the model's endpoint. */
56
+ baseUrl?: string;
57
+ }
58
+ export declare class PiAiProvider implements Provider {
59
+ readonly id: string;
60
+ readonly name: string;
61
+ private readonly opts;
62
+ /**
63
+ * Only defined when the endpoint publishes a `/models` listing — callers
64
+ * test for its presence, so defining it unconditionally would make every
65
+ * provider claim it can enumerate models.
66
+ */
67
+ readonly listModels?: () => Promise<ModelSpec[]>;
68
+ constructor(opts: PiAiProviderOptions);
69
+ isConfigured(): boolean;
70
+ private apiKey;
71
+ private baseUrl;
72
+ stream(request: GenerateRequest): AsyncGenerator<StreamEvent, void, void>;
73
+ /**
74
+ * Sampling knobs pi-ai does not model. They are merged into the request body
75
+ * verbatim by the OpenAI-compatible adapters only, so anything sent here is
76
+ * silently dropped by the Anthropic, Google and Bedrock protocols.
77
+ */
78
+ private samplingParams;
79
+ /**
80
+ * How many tokens to ask for, under whatever ceiling the endpoint imposes.
81
+ *
82
+ * The model's own limit is the usual answer. A gateway that caps output
83
+ * below it is a separate fact — the models it serves still advertise their
84
+ * real maximum, and a request over the gateway's line is refused rather than
85
+ * truncated, so the clamp has to happen here on the way out.
86
+ */
87
+ private maxTokensFor;
88
+ /**
89
+ * Provider headers plus whatever the resolver produced. A `null` value
90
+ * suppresses a header the SDK would otherwise set: bearer-token auth must
91
+ * remove the `x-api-key` the Anthropic client adds from `apiKey`, or the API
92
+ * sees two conflicting credentials and rejects the request.
93
+ *
94
+ * Called once per `stream()`, which is what makes the idempotency key below
95
+ * correct: pi-ai's own retries reuse this object and so resend the same key,
96
+ * which is how a gateway is told "this is the call that already reserved,
97
+ * not a new one" — while a retry the harness decides on comes back through
98
+ * `stream()` and gets a fresh key, because by then the first attempt may
99
+ * have been billed.
100
+ */
101
+ private requestHeaders;
102
+ /** Translate a harness model spec into the shape pi-ai dispatches on. */
103
+ private toPiModel;
104
+ /**
105
+ * Per-protocol quirks the catalog knows about. pi-ai auto-detects these from
106
+ * the base URL for vendors it recognizes; everything here is the subset the
107
+ * catalog states outright, which must win over a guess made from a hostname.
108
+ */
109
+ private compatFor;
110
+ }
111
+ export interface ContextOptions {
112
+ /** The provider about to be called, for deciding what is replayable. */
113
+ providerId: string;
114
+ thinkingOn: boolean;
115
+ }
116
+ /**
117
+ * One harness message can become several pi-ai messages.
118
+ *
119
+ * The harness stores tool results as blocks inside the *user* message that
120
+ * carries them, because that is how the conversation reads. pi-ai models them
121
+ * as their own `toolResult` role, so they are split out here — in order, since
122
+ * every provider requires a tool result to directly follow the call it answers.
123
+ */
124
+ export declare function toPiMessages(message: Message, opts: ContextOptions): PiMessage[];