@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,327 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { createServer } from "node:http";
3
+ import { parseJson } from "../util/json.js";
4
+ /** RFC 7636 S256 challenge. */
5
+ export function createPkce() {
6
+ const verifier = base64Url(randomBytes(32));
7
+ const challenge = base64Url(createHash("sha256").update(verifier).digest());
8
+ return { verifier, challenge };
9
+ }
10
+ function base64Url(buffer) {
11
+ return buffer.toString("base64url");
12
+ }
13
+ export async function exchangeToken(opts) {
14
+ const body = new URLSearchParams({ client_id: opts.clientId, ...opts.params });
15
+ const headers = {
16
+ "content-type": "application/x-www-form-urlencoded",
17
+ accept: "application/json",
18
+ ...opts.headers,
19
+ };
20
+ const mode = opts.clientAuth ?? (opts.clientSecret ? "post" : "none");
21
+ if (opts.clientSecret && mode === "post")
22
+ body.set("client_secret", opts.clientSecret);
23
+ if (opts.clientSecret && mode === "basic") {
24
+ const basic = Buffer.from(`${opts.clientId}:${opts.clientSecret}`).toString("base64");
25
+ headers["authorization"] = `Basic ${basic}`;
26
+ }
27
+ const response = await fetch(opts.tokenUrl, { method: "POST", headers, body });
28
+ const text = await response.text();
29
+ const parsed = parseJson(text);
30
+ if (!response.ok) {
31
+ const detail = parsed.ok
32
+ ? (parsed.value.error_description ?? parsed.value.error ?? text)
33
+ : text;
34
+ throw new Error(`token endpoint returned ${response.status}: ${String(detail).slice(0, 300)}`);
35
+ }
36
+ if (!parsed.ok)
37
+ throw new Error(`token endpoint returned non-JSON: ${text.slice(0, 200)}`);
38
+ if (!parsed.value.access_token)
39
+ throw new Error("token endpoint returned no access_token");
40
+ return parsed.value;
41
+ }
42
+ export function toCredential(token, previousRefresh) {
43
+ return { type: "oauth", ...credentialFields(token, previousRefresh) };
44
+ }
45
+ /** The credential body without the `type` discriminant, for spreading into results. */
46
+ export function credentialFields(token, previousRefresh) {
47
+ return {
48
+ access: token.access_token,
49
+ // Some providers omit refresh_token on refresh and expect you to keep the
50
+ // original — dropping it here would silently end the session at expiry.
51
+ refresh: token.refresh_token ?? previousRefresh ?? "",
52
+ expires: token.expires_in ? Date.now() + token.expires_in * 1_000 : 0,
53
+ };
54
+ }
55
+ export async function refreshCredential(credential, opts) {
56
+ if (!credential.refresh)
57
+ return undefined;
58
+ const token = await exchangeToken({
59
+ ...opts,
60
+ params: {
61
+ grant_type: "refresh_token",
62
+ refresh_token: credential.refresh,
63
+ ...(opts.scope ? { scope: opts.scope } : {}),
64
+ ...opts.tokenParams,
65
+ },
66
+ });
67
+ return {
68
+ ...toCredential(token, credential.refresh),
69
+ ...(credential.accountId ? { accountId: credential.accountId } : {}),
70
+ ...(credential.baseUrl ? { baseUrl: credential.baseUrl } : {}),
71
+ ...(credential.metadata ? { metadata: credential.metadata } : {}),
72
+ };
73
+ }
74
+ /**
75
+ * Start a device flow. The returned `callback()` polls until the user finishes
76
+ * authorizing in their browser.
77
+ */
78
+ export async function startDeviceFlow(opts) {
79
+ const response = await fetch(opts.deviceCodeUrl, {
80
+ method: "POST",
81
+ headers: {
82
+ "content-type": "application/x-www-form-urlencoded",
83
+ accept: "application/json",
84
+ ...opts.headers,
85
+ },
86
+ body: new URLSearchParams({
87
+ client_id: opts.clientId,
88
+ ...(opts.scope ? { scope: opts.scope } : {}),
89
+ }),
90
+ });
91
+ const text = await response.text();
92
+ const parsed = parseJson(text);
93
+ if (!response.ok || !parsed.ok) {
94
+ throw new Error(`device code request failed (${response.status}): ${text.slice(0, 200)}`);
95
+ }
96
+ const device = parsed.value;
97
+ // Servers advertise a minimum poll interval; going faster earns slow_down.
98
+ let intervalMs = Math.max(1, device.interval ?? 5) * 1_000;
99
+ const maxAttempts = opts.maxAttempts ?? Math.ceil((device.expires_in ?? 900) / (intervalMs / 1_000));
100
+ return {
101
+ method: "auto",
102
+ url: device.verification_uri_complete ?? device.verification_uri,
103
+ instructions: `Open ${device.verification_uri} and enter the code: ${device.user_code}`,
104
+ async callback() {
105
+ for (let attempt = 0; attempt < maxAttempts; attempt++) {
106
+ await sleep(intervalMs);
107
+ const poll = await fetch(opts.tokenUrl, {
108
+ method: "POST",
109
+ headers: {
110
+ "content-type": "application/x-www-form-urlencoded",
111
+ accept: "application/json",
112
+ ...opts.headers,
113
+ },
114
+ body: new URLSearchParams({
115
+ client_id: opts.clientId,
116
+ device_code: device.device_code,
117
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
118
+ }),
119
+ });
120
+ const body = parseJson(await poll.text());
121
+ if (!body.ok)
122
+ continue;
123
+ if (body.value.access_token) {
124
+ return { type: "success", ...credentialFields(body.value) };
125
+ }
126
+ switch (body.value.error) {
127
+ case "authorization_pending":
128
+ continue;
129
+ case "slow_down":
130
+ intervalMs += 5_000;
131
+ continue;
132
+ case "expired_token":
133
+ return { type: "failed", error: "the device code expired before you authorized" };
134
+ case "access_denied":
135
+ return { type: "failed", error: "authorization was denied" };
136
+ default:
137
+ return { type: "failed", error: body.value.error ?? "unknown error" };
138
+ }
139
+ }
140
+ return { type: "failed", error: "timed out waiting for authorization" };
141
+ },
142
+ };
143
+ }
144
+ /**
145
+ * Authorization-code + PKCE where the user pastes the code back.
146
+ *
147
+ * Used when we cannot listen on a loopback port (remote shells, containers),
148
+ * which is common enough that it is worth having as the simpler default.
149
+ */
150
+ export function startAuthCodeFlow(opts) {
151
+ const pkce = createPkce();
152
+ const state = base64Url(randomBytes(16));
153
+ const url = new URL(opts.authorizeUrl);
154
+ url.searchParams.set("response_type", "code");
155
+ url.searchParams.set("client_id", opts.clientId);
156
+ url.searchParams.set("redirect_uri", opts.redirectUri);
157
+ url.searchParams.set("code_challenge", pkce.challenge);
158
+ url.searchParams.set("code_challenge_method", "S256");
159
+ url.searchParams.set("state", state);
160
+ if (opts.scope)
161
+ url.searchParams.set("scope", opts.scope);
162
+ for (const [key, value] of Object.entries(opts.extraParams ?? {})) {
163
+ url.searchParams.set(key, value);
164
+ }
165
+ return {
166
+ method: "code",
167
+ url: url.toString(),
168
+ instructions: "Authorize in the browser, then paste the code you are given.",
169
+ async callback(code) {
170
+ try {
171
+ // Some providers append the state to the code as `code#state`.
172
+ const [rawCode, returnedState] = code.trim().split("#");
173
+ if (returnedState && returnedState !== state) {
174
+ return { type: "failed", error: "state mismatch — restart the login" };
175
+ }
176
+ const token = await exchangeToken({
177
+ tokenUrl: opts.tokenUrl,
178
+ clientId: opts.clientId,
179
+ clientSecret: opts.clientSecret,
180
+ headers: opts.headers,
181
+ params: {
182
+ grant_type: "authorization_code",
183
+ code: rawCode,
184
+ redirect_uri: opts.redirectUri,
185
+ code_verifier: pkce.verifier,
186
+ state,
187
+ ...opts.tokenParams,
188
+ },
189
+ });
190
+ return { type: "success", ...credentialFields(token) };
191
+ }
192
+ catch (err) {
193
+ return { type: "failed", error: err instanceof Error ? err.message : String(err) };
194
+ }
195
+ },
196
+ };
197
+ }
198
+ /**
199
+ * Authorization-code + PKCE with a loopback listener, so the browser redirect
200
+ * completes the flow without the user copying anything.
201
+ *
202
+ * `prepare` exists for dynamic client registration: the redirect URI has to be
203
+ * named when the client is registered, and its port is not known until the
204
+ * listener is up. So the port is claimed first, the caller gets a chance to go
205
+ * register against it, and only then is the browser sent anywhere.
206
+ */
207
+ export async function startLoopbackFlow(opts) {
208
+ const pkce = createPkce();
209
+ const state = base64Url(randomBytes(16));
210
+ const { server, port, waitForCode } = await listenForCode(state);
211
+ const redirectUri = `http://127.0.0.1:${port}/callback`;
212
+ let resolved = opts;
213
+ if (opts.prepare) {
214
+ try {
215
+ resolved = { ...opts, ...(await opts.prepare(redirectUri)) };
216
+ }
217
+ catch (err) {
218
+ server.close();
219
+ throw err;
220
+ }
221
+ }
222
+ if (!resolved.clientId) {
223
+ server.close();
224
+ throw new Error("no client id: registration did not produce one");
225
+ }
226
+ const url = new URL(resolved.authorizeUrl);
227
+ url.searchParams.set("response_type", "code");
228
+ url.searchParams.set("client_id", resolved.clientId);
229
+ url.searchParams.set("redirect_uri", redirectUri);
230
+ url.searchParams.set("code_challenge", pkce.challenge);
231
+ url.searchParams.set("code_challenge_method", "S256");
232
+ url.searchParams.set("state", state);
233
+ if (resolved.scope)
234
+ url.searchParams.set("scope", resolved.scope);
235
+ for (const [key, value] of Object.entries(resolved.extraParams ?? {})) {
236
+ url.searchParams.set(key, value);
237
+ }
238
+ return {
239
+ method: "auto",
240
+ url: url.toString(),
241
+ instructions: "Complete the login in your browser; this will continue automatically.",
242
+ async callback() {
243
+ try {
244
+ const code = await waitForCode;
245
+ const token = await exchangeToken({
246
+ tokenUrl: resolved.tokenUrl,
247
+ clientId: resolved.clientId,
248
+ clientSecret: resolved.clientSecret,
249
+ headers: resolved.headers,
250
+ params: {
251
+ grant_type: "authorization_code",
252
+ code,
253
+ redirect_uri: redirectUri,
254
+ code_verifier: pkce.verifier,
255
+ ...resolved.tokenParams,
256
+ },
257
+ });
258
+ return { type: "success", ...credentialFields(token) };
259
+ }
260
+ catch (err) {
261
+ return { type: "failed", error: err instanceof Error ? err.message : String(err) };
262
+ }
263
+ finally {
264
+ server.close();
265
+ }
266
+ },
267
+ };
268
+ }
269
+ async function listenForCode(expectedState) {
270
+ let resolveCode;
271
+ let rejectCode;
272
+ const waitForCode = new Promise((resolve, reject) => {
273
+ resolveCode = resolve;
274
+ rejectCode = reject;
275
+ });
276
+ const server = createServer((req, res) => {
277
+ const requestUrl = new URL(req.url ?? "/", "http://127.0.0.1");
278
+ const code = requestUrl.searchParams.get("code");
279
+ const state = requestUrl.searchParams.get("state");
280
+ const error = requestUrl.searchParams.get("error");
281
+ const reply = (status, message) => {
282
+ res.writeHead(status, { "content-type": "text/html; charset=utf-8" });
283
+ res.end(`<!doctype html><meta charset="utf-8"><title>OHarness</title>
284
+ <body style="font-family:system-ui;padding:3rem;max-width:32rem">
285
+ <h1>${status === 200 ? "Signed in" : "Login failed"}</h1><p>${message}</p></body>`);
286
+ };
287
+ if (error) {
288
+ reply(400, `The provider returned: ${escapeHtml(error)}`);
289
+ rejectCode(new Error(`authorization failed: ${error}`));
290
+ return;
291
+ }
292
+ if (state !== expectedState) {
293
+ reply(400, "State mismatch — the login may have been tampered with. Please retry.");
294
+ rejectCode(new Error("state mismatch"));
295
+ return;
296
+ }
297
+ if (!code) {
298
+ reply(400, "No authorization code was returned.");
299
+ return;
300
+ }
301
+ reply(200, "You can close this tab and return to the terminal.");
302
+ resolveCode(code);
303
+ });
304
+ await new Promise((resolve, reject) => {
305
+ server.once("error", reject);
306
+ // Port 0 lets the OS pick a free port; 127.0.0.1 keeps it off the network.
307
+ server.listen(0, "127.0.0.1", resolve);
308
+ });
309
+ const address = server.address();
310
+ // Don't leave a listener open forever if the user abandons the browser.
311
+ // Unref'd: an abandoned login should not be the reason a process refuses to
312
+ // exit for the next five minutes.
313
+ const timeout = setTimeout(() => {
314
+ rejectCode(new Error("timed out waiting for the browser redirect"));
315
+ server.close();
316
+ }, 5 * 60_000);
317
+ timeout.unref?.();
318
+ waitForCode.finally(() => clearTimeout(timeout)).catch(() => { });
319
+ return { server, port: address.port, waitForCode };
320
+ }
321
+ function escapeHtml(value) {
322
+ return value.replace(/[&<>"']/g, (ch) => ch === "&" ? "&amp;" : ch === "<" ? "&lt;" : ch === ">" ? "&gt;" : ch === '"' ? "&quot;" : "&#39;");
323
+ }
324
+ function sleep(ms) {
325
+ return new Promise((resolve) => setTimeout(resolve, ms));
326
+ }
327
+ //# sourceMappingURL=oauth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/auth/oauth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { CallbackResult, OAuthCredential, OAuthMethod } from "../types.ts";
2
+ /** Whether this build knows an account project to talk to at all. */
3
+ export declare function accountsConfigured(): boolean;
4
+ export declare function supabaseUrl(): string;
5
+ export declare function siteUrl(): string;
6
+ /**
7
+ * Signing in by sending the user to the site, in their own browser.
8
+ *
9
+ * The emailed code below works from anywhere, which is why it is still here —
10
+ * a terminal over SSH has no browser to open. But on a machine that does have
11
+ * one, sending them to the site's own login is strictly better: it is the page
12
+ * that offers a password and Google, it is the page that knows how to sign
13
+ * someone *up*, and neither of those has to be reimplemented here to stay
14
+ * working.
15
+ *
16
+ * What comes back is a sealed code on a loopback redirect, traded for the
17
+ * session over HTTPS. The frontend owns the loopback listener because it is
18
+ * the one already running a local server; this pair of functions is the part
19
+ * that belongs to the account rather than to any one frontend.
20
+ */
21
+ export declare function browserSignInUrl(opts: {
22
+ /** The frontend's own nonce, echoed back so it can recognise its flow. */
23
+ state: string;
24
+ /** Loopback address the browser is sent back to. */
25
+ redirectUri: string;
26
+ /** Language for the login page, if the frontend knows one. */
27
+ locale?: string;
28
+ }): string;
29
+ /** Trade a sealed handoff code for the session it stands for. */
30
+ export declare function exchangeHandoff(code: string, state: string): Promise<CallbackResult>;
31
+ /** Every Supabase auth call carries the anon key as well as any bearer token. */
32
+ export declare function supabaseHeaders(): Record<string, string>;
33
+ export interface GoTrueSession {
34
+ access_token?: string;
35
+ refresh_token?: string;
36
+ expires_in?: number;
37
+ error?: string;
38
+ error_description?: string;
39
+ msg?: string;
40
+ message?: string;
41
+ }
42
+ /** The emailed-code sign-in, as an OAuth method a provider can declare. */
43
+ export declare function accountSignIn(label: string): OAuthMethod;
44
+ /** Exchange the emailed code for a session. */
45
+ export declare function verifyOtp(email: string, code: string): Promise<CallbackResult>;
46
+ /** Trade a refresh token for a fresh session, or nothing if it is still good. */
47
+ export declare function refreshSession(credential: OAuthCredential): Promise<OAuthCredential | undefined>;
48
+ export declare function toCredential(session: GoTrueSession, previous?: OAuthCredential): OAuthCredential;
49
+ /**
50
+ * GoTrue reports failures under several field names depending on the version
51
+ * and the error class. Probing them beats showing a bare status code, which is
52
+ * what "sign-in failed (400)" leaves the user debugging.
53
+ */
54
+ export declare function failureDetail(response: Response): Promise<string>;
55
+ /** The bearer shape both account-backed providers resolve to. */
56
+ export declare function bearer(token: string, source: string): {
57
+ headers: Record<string, string>;
58
+ source: string;
59
+ };