@oharness/engine 0.1.0 → 0.2.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 (90) hide show
  1. package/README.md +26 -0
  2. package/dist/agent/agent.d.ts +11 -0
  3. package/dist/agent/agent.js +30 -9
  4. package/dist/agent/agent.js.map +1 -1
  5. package/dist/agent/hooks.d.ts +2 -0
  6. package/dist/agent/hooks.js +11 -0
  7. package/dist/agent/hooks.js.map +1 -1
  8. package/dist/agent/memory.d.ts +10 -1
  9. package/dist/agent/memory.js +147 -49
  10. package/dist/agent/memory.js.map +1 -1
  11. package/dist/agent/permissions.js +21 -3
  12. package/dist/agent/permissions.js.map +1 -1
  13. package/dist/artifacts/publish.d.ts +2 -2
  14. package/dist/artifacts/publish.js +2 -2
  15. package/dist/auth/index.d.ts +1 -1
  16. package/dist/auth/index.js +1 -1
  17. package/dist/auth/index.js.map +1 -1
  18. package/dist/auth/manager.d.ts +14 -0
  19. package/dist/auth/manager.js +25 -5
  20. package/dist/auth/manager.js.map +1 -1
  21. package/dist/auth/providers/account.d.ts +10 -45
  22. package/dist/auth/providers/account.js +123 -233
  23. package/dist/auth/providers/account.js.map +1 -1
  24. package/dist/config-files.d.ts +27 -0
  25. package/dist/config-files.js +116 -0
  26. package/dist/config-files.js.map +1 -0
  27. package/dist/config.d.ts +5 -25
  28. package/dist/config.js +16 -2
  29. package/dist/config.js.map +1 -1
  30. package/dist/core/audit.d.ts +20 -0
  31. package/dist/core/audit.js +2 -0
  32. package/dist/core/audit.js.map +1 -0
  33. package/dist/harness.d.ts +35 -2
  34. package/dist/harness.js +162 -50
  35. package/dist/harness.js.map +1 -1
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/dist/providers/registry.d.ts +42 -0
  40. package/dist/providers/registry.js +71 -9
  41. package/dist/providers/registry.js.map +1 -1
  42. package/dist/runtime-plugins/audit.d.ts +11 -0
  43. package/dist/runtime-plugins/audit.js +31 -0
  44. package/dist/runtime-plugins/audit.js.map +1 -0
  45. package/dist/runtime-plugins/builtin/jsonl-audit.d.ts +7 -0
  46. package/dist/runtime-plugins/builtin/jsonl-audit.js +24 -0
  47. package/dist/runtime-plugins/builtin/jsonl-audit.js.map +1 -0
  48. package/dist/runtime-plugins/builtin/memory.d.ts +70 -0
  49. package/dist/runtime-plugins/builtin/memory.js +360 -0
  50. package/dist/runtime-plugins/builtin/memory.js.map +1 -0
  51. package/dist/runtime-plugins/cloud-connector.d.ts +56 -0
  52. package/dist/runtime-plugins/cloud-connector.js +261 -0
  53. package/dist/runtime-plugins/cloud-connector.js.map +1 -0
  54. package/dist/runtime-plugins/composio/client.d.ts +65 -0
  55. package/dist/runtime-plugins/composio/client.js +190 -0
  56. package/dist/runtime-plugins/composio/client.js.map +1 -0
  57. package/dist/runtime-plugins/composio/index.d.ts +23 -0
  58. package/dist/runtime-plugins/composio/index.js +113 -0
  59. package/dist/runtime-plugins/composio/index.js.map +1 -0
  60. package/dist/runtime-plugins/connector.d.ts +15 -0
  61. package/dist/runtime-plugins/connector.js +17 -0
  62. package/dist/runtime-plugins/connector.js.map +1 -0
  63. package/dist/runtime-plugins/extensions.d.ts +21 -0
  64. package/dist/runtime-plugins/extensions.js +23 -0
  65. package/dist/runtime-plugins/extensions.js.map +1 -0
  66. package/dist/runtime-plugins/host.d.ts +34 -0
  67. package/dist/runtime-plugins/host.js +263 -0
  68. package/dist/runtime-plugins/host.js.map +1 -0
  69. package/dist/runtime-plugins/index.d.ts +12 -0
  70. package/dist/runtime-plugins/index.js +7 -0
  71. package/dist/runtime-plugins/index.js.map +1 -0
  72. package/dist/runtime-plugins/loader.d.ts +5 -0
  73. package/dist/runtime-plugins/loader.js +36 -0
  74. package/dist/runtime-plugins/loader.js.map +1 -0
  75. package/dist/runtime-plugins/tool-adapter.d.ts +3 -0
  76. package/dist/runtime-plugins/tool-adapter.js +13 -0
  77. package/dist/runtime-plugins/tool-adapter.js.map +1 -0
  78. package/dist/runtime-plugins/types.d.ts +81 -0
  79. package/dist/runtime-plugins/types.js +2 -0
  80. package/dist/runtime-plugins/types.js.map +1 -0
  81. package/dist/sync/settings.d.ts +2 -0
  82. package/dist/sync/settings.js +17 -1
  83. package/dist/sync/settings.js.map +1 -1
  84. package/dist/tools/registry.d.ts +2 -0
  85. package/dist/tools/registry.js +10 -0
  86. package/dist/tools/registry.js.map +1 -1
  87. package/dist/tools/types.d.ts +2 -0
  88. package/dist/tools/types.js.map +1 -1
  89. package/official.json +1 -2
  90. package/package.json +1 -1
@@ -0,0 +1,360 @@
1
+ import path from "node:path";
2
+ import { createHash } from "node:crypto";
3
+ import { MemoryStore, memoryNote, noteHash, validateNote, validMemoryId } from "../../agent/memory.js";
4
+ import { createMemoryTools } from "../../tools/builtin/memory.js";
5
+ import { readPluginFile, readUserFile, updateRuntimePluginConfig, writeUserFile } from "../../config-files.js";
6
+ import { projectId } from "../../storage/project.js";
7
+ import { resolveSyncUrl } from "../../sync/settings.js";
8
+ const digest = (x) => createHash("sha256").update(x).digest("hex");
9
+ const object = (x) => !!x && typeof x === "object" && !Array.isArray(x);
10
+ /** One project's local notes and explicit per-device/account sync consent. */
11
+ export class MemoryService {
12
+ store;
13
+ options;
14
+ target;
15
+ controller;
16
+ timer;
17
+ running;
18
+ closed = false;
19
+ disabling = false;
20
+ conflicts = [];
21
+ error;
22
+ lastSync;
23
+ binding;
24
+ settingsRevision = 0;
25
+ retryAt = 0;
26
+ snapshotCache;
27
+ constructor(options) {
28
+ this.options = options;
29
+ this.store = new MemoryStore(options.directory);
30
+ this.target = digest(path.resolve(options.directory));
31
+ }
32
+ consent() {
33
+ const plugin = readPluginFile()?.runtimePlugins?.find((p) => p.id === "memory");
34
+ if (plugin?.enabled === false)
35
+ return { userId: "", origin: "", enabled: false };
36
+ const config = plugin?.config;
37
+ if (config !== undefined && (!object(config) || config.syncTargets !== undefined && !object(config.syncTargets)))
38
+ throw new Error("Memory 同步配置无效;已停止同步。");
39
+ const value = object(config) && object(config.syncTargets) ? config.syncTargets[this.target] : undefined;
40
+ if (value === undefined)
41
+ return undefined;
42
+ if (!object(value) || typeof value.enabled !== "boolean" || typeof value.userId !== "string" || typeof value.origin !== "string")
43
+ throw new Error("Memory 同步配置无效;已停止同步。");
44
+ return value;
45
+ }
46
+ stateFile(identity) { return "memory-sync/" + digest(identity.origin + ":" + identity.userId + ":" + this.target) + ".json"; }
47
+ async allowed() {
48
+ if (this.closed || this.disabling)
49
+ throw new Error("Memory 同步已停止。");
50
+ const consent = this.consent();
51
+ if (consent?.enabled === false)
52
+ throw new Error("此项目的云同步已手动关闭。");
53
+ const identity = await this.options.identity();
54
+ if (!identity || consent && (identity.userId !== consent.userId || identity.origin !== consent.origin))
55
+ throw new Error("登录账号或 Cloud 地址已改变,Memory 同步已暂停。");
56
+ if (!consent) {
57
+ await updateRuntimePluginConfig("memory", (config) => {
58
+ const targets = object(config.syncTargets) ? config.syncTargets : {};
59
+ // Another instance may have disabled/bound the directory while awaiting the write queue.
60
+ if (targets[this.target])
61
+ return config;
62
+ return { ...config, syncTargets: { ...targets, [this.target]: { ...identity, enabled: true } } };
63
+ });
64
+ const pinned = this.consent();
65
+ if (!pinned?.enabled || pinned.userId !== identity.userId || pinned.origin !== identity.origin)
66
+ throw new Error("Memory 同步设置已改变。");
67
+ }
68
+ if (this.closed || this.disabling || this.consent()?.enabled === false)
69
+ throw new Error("Memory 同步已停止。");
70
+ return identity;
71
+ }
72
+ start() {
73
+ const tick = async () => {
74
+ if (this.closed || this.consent()?.enabled === false || this.conflicts.length || Date.now() < this.retryAt)
75
+ return;
76
+ const identity = await this.options.identity();
77
+ if (identity)
78
+ await this.sync().catch(() => { });
79
+ };
80
+ this.timer = setInterval(() => { void tick().catch(() => { }); }, this.options.pollMs ?? 15000);
81
+ this.timer.unref();
82
+ void tick().catch(() => { });
83
+ }
84
+ async status() {
85
+ const identity = await this.options.identity(), consent = this.consent();
86
+ const matching = !!identity && (!consent?.userId || identity.userId === consent.userId && identity.origin === consent.origin);
87
+ const persisted = identity && matching ? readUserFile(this.stateFile(identity)) : undefined;
88
+ let entries = [], localError;
89
+ try {
90
+ entries = (await this.store.load()).map((entry) => ({ ...memoryNote(entry), hash: noteHash(entry) }));
91
+ }
92
+ catch {
93
+ localError = "本地记忆文件无法读取或格式无效;请检查记忆目录。同步已暂停,原文件未改动。";
94
+ }
95
+ return { signedIn: !!identity, enabled: consent?.enabled !== false, ready: matching && consent?.enabled !== false,
96
+ syncing: !!this.running, lastSync: persisted?.lastSync ?? this.lastSync, error: localError ?? this.error,
97
+ accountChanged: !!identity && !!consent?.userId && !matching, conflicts: this.conflicts,
98
+ location: this.store.location, entries };
99
+ }
100
+ async enable(enabled) {
101
+ const revision = ++this.settingsRevision;
102
+ if (!enabled) {
103
+ this.disabling = true;
104
+ this.controller?.abort();
105
+ try {
106
+ await updateRuntimePluginConfig("memory", (config) => ({ ...config, syncTargets: {
107
+ ...(object(config.syncTargets) ? config.syncTargets : {}),
108
+ [this.target]: { ...(this.consent() ?? { userId: "", origin: "" }), enabled: false },
109
+ } }));
110
+ await this.running?.catch(() => { });
111
+ }
112
+ finally {
113
+ if (revision === this.settingsRevision)
114
+ this.disabling = false;
115
+ }
116
+ return;
117
+ }
118
+ const identity = await this.options.identity();
119
+ if (!identity)
120
+ throw new Error("请先登录 OHarness。");
121
+ const previous = this.consent();
122
+ if (previous?.userId && (previous.userId !== identity.userId || previous.origin !== identity.origin)) {
123
+ throw new Error("此目录已绑定另一账号或 Cloud;请使用独立的本地记忆目录,避免跨账号上传。");
124
+ }
125
+ // Explicit opt-in verifies identity remotely, but uploads no content yet.
126
+ const verified = await this.request("identity", {}, identity, new AbortController().signal, false);
127
+ if (verified.principal !== identity.userId)
128
+ throw new Error("账号校验失败。");
129
+ await updateRuntimePluginConfig("memory", (config) => {
130
+ if (this.closed || revision !== this.settingsRevision)
131
+ throw new Error("Memory 同步设置已改变。");
132
+ return { ...config, syncTargets: {
133
+ ...(object(config.syncTargets) ? config.syncTargets : {}), [this.target]: { ...identity, enabled: true },
134
+ } };
135
+ });
136
+ this.disabling = false;
137
+ this.error = undefined;
138
+ this.retryAt = 0;
139
+ }
140
+ sync() {
141
+ if (this.running)
142
+ return this.running;
143
+ const job = this.perform().catch((error) => {
144
+ this.error = error instanceof Error ? error.message : "同步失败";
145
+ this.retryAt = Date.now() + 60000;
146
+ throw error;
147
+ }).finally(() => { this.running = undefined; this.controller = undefined; });
148
+ this.running = job;
149
+ return job;
150
+ }
151
+ async perform() {
152
+ const controller = this.controller = new AbortController();
153
+ const identity = await this.allowed();
154
+ controller.signal.throwIfAborted();
155
+ this.binding = this.stateFile(identity);
156
+ const project = await projectId(this.options.cwd);
157
+ const state = readUserFile(this.binding);
158
+ const base = state?.base ?? {};
159
+ const local = new Map((await this.store.load()).map((entry) => [entry.id, memoryNote(entry)]));
160
+ let remote = await this.request("snapshot", { project, ...(this.snapshotCache?.etag ? { knownEtag: this.snapshotCache.etag } : {}) }, identity, controller.signal);
161
+ if (remote.unchanged) {
162
+ if (!this.snapshotCache || remote.etag !== this.snapshotCache.etag)
163
+ throw new Error("无效同步版本。");
164
+ remote = this.snapshotCache;
165
+ }
166
+ this.validateSnapshot(remote);
167
+ this.snapshotCache = remote;
168
+ const cloud = new Map(remote.entries.map((entry) => [entry.id, entry]));
169
+ const changes = [], nextBase = { ...base };
170
+ this.conflicts = [];
171
+ for (const id of new Set([...Object.keys(base), ...local.keys(), ...cloud.keys()])) {
172
+ const l = local.get(id), r = cloud.get(id), lh = noteHash(l), rh = r?.hash ?? null, old = base[id] ?? null;
173
+ if (lh === rh) {
174
+ nextBase[id] = rh;
175
+ continue;
176
+ }
177
+ if (lh !== old && rh !== old) {
178
+ this.conflicts.push({ id, local: l ?? null, cloud: r?.note ?? null, localHash: lh, cloudHash: rh });
179
+ }
180
+ else if (lh !== old)
181
+ changes.push({ id, hash: lh, ...(l ? { note: l } : {}) });
182
+ }
183
+ if (this.conflicts.length)
184
+ throw new Error("存在冲突,双方版本均已保留;请选择保留本地或采用云端。");
185
+ if (changes.length) {
186
+ remote = await this.request("commit", { project, etag: remote.etag, changes }, identity, controller.signal);
187
+ this.validateSnapshot(remote);
188
+ this.snapshotCache = remote;
189
+ }
190
+ // No writes/merges after a disable or account switch observed during the request.
191
+ await this.allowed();
192
+ controller.signal.throwIfAborted();
193
+ for (const r of remote.entries) {
194
+ const expected = noteHash(local.get(r.id));
195
+ if (expected !== r.hash) {
196
+ await this.allowed();
197
+ controller.signal.throwIfAborted();
198
+ await this.store.apply(r.id, r.note, expected);
199
+ }
200
+ nextBase[r.id] = r.hash;
201
+ }
202
+ await this.allowed();
203
+ controller.signal.throwIfAborted();
204
+ this.lastSync = Date.now();
205
+ this.error = undefined;
206
+ this.retryAt = 0;
207
+ await writeUserFile(this.binding, { base: nextBase, lastSync: this.lastSync });
208
+ }
209
+ async resolve(id, choice) {
210
+ if (this.running)
211
+ throw new Error("请等待同步结束。");
212
+ const identity = await this.allowed();
213
+ if (this.stateFile(identity) !== this.binding)
214
+ throw new Error("账号已改变。");
215
+ const conflict = this.conflicts.find((entry) => entry.id === id);
216
+ if (!conflict || !["local", "cloud"].includes(choice))
217
+ throw new Error("无效冲突选择。");
218
+ const current = (await this.store.load()).find((entry) => entry.id === id);
219
+ if (noteHash(current) !== conflict.localHash)
220
+ throw new Error("本地记忆已改变,请重新同步。");
221
+ // Save the losing local version before adopting Cloud (also for cloud deletion).
222
+ if (choice === "cloud") {
223
+ if (current)
224
+ await writeUserFile("memory-backups/" + digest(this.binding + id + Date.now()) + ".json", memoryNote(current));
225
+ await this.store.apply(id, conflict.cloud ?? undefined, conflict.localHash);
226
+ }
227
+ const file = this.stateFile(identity), state = readUserFile(file);
228
+ await writeUserFile(file, { base: { ...state?.base, [id]: conflict.cloudHash } });
229
+ this.conflicts = this.conflicts.filter((entry) => entry.id !== id);
230
+ this.error = this.conflicts.length ? "还有冲突需要处理。" : undefined;
231
+ }
232
+ validateSnapshot(value) {
233
+ if (!object(value) || !Array.isArray(value.entries) || value.entries.length > 500 || !(value.etag === null || typeof value.etag === "string"))
234
+ throw new Error("无效同步清单。");
235
+ const seen = new Set();
236
+ for (const entry of value.entries) {
237
+ if (!object(entry) || !validMemoryId(entry.id) || seen.has(entry.id))
238
+ throw new Error("无效同步条目。");
239
+ seen.add(entry.id);
240
+ if (entry.note) {
241
+ validateNote(entry.note);
242
+ if (entry.note.id !== entry.id)
243
+ throw new Error("记忆 ID 不匹配。");
244
+ }
245
+ if (noteHash(entry.note) !== entry.hash)
246
+ throw new Error("记忆校验失败。");
247
+ }
248
+ }
249
+ async request(action, input, identity, signal, gated = true) {
250
+ if (gated)
251
+ await this.allowed();
252
+ const current = await this.options.identity();
253
+ if (!current || current.userId !== identity.userId || current.origin !== identity.origin)
254
+ throw new Error("账号已改变。");
255
+ const token = await this.options.token();
256
+ if (!token)
257
+ throw new Error("请重新登录 OHarness。");
258
+ if (gated)
259
+ await this.allowed();
260
+ signal.throwIfAborted();
261
+ let response;
262
+ const endpoint = resolveSyncUrl({ url: this.options.syncUrl?.() ?? resolveSyncUrl() });
263
+ try {
264
+ response = await (this.options.fetch ?? fetch)(endpoint + "/v1/memory/" + action, {
265
+ method: "POST", redirect: "error", headers: { "content-type": "application/json", authorization: "Bearer " + token },
266
+ body: JSON.stringify({ ...input, expectedPrincipal: identity.userId }),
267
+ signal: AbortSignal.any([signal, AbortSignal.timeout(60000)]),
268
+ });
269
+ }
270
+ catch {
271
+ throw new Error("Memory 云同步请求失败或已取消;可手动重试。");
272
+ }
273
+ if (!response.ok) {
274
+ await response.body?.cancel();
275
+ throw new Error(response.status === 409 ? "云端版本已改变,请重新同步。" : response.status === 503 ? "Sync 服务尚未配置 Memory 鉴权或 R2 存储。" : "同步请求被拒绝,请检查账号和 Sync 配置。");
276
+ }
277
+ const reader = response.body?.getReader();
278
+ if (!reader)
279
+ throw new Error("同步响应为空。");
280
+ const chunks = [];
281
+ let length = 0;
282
+ try {
283
+ for (;;) {
284
+ const { done, value } = await reader.read();
285
+ if (done)
286
+ break;
287
+ length += value.length;
288
+ if (length > 4 * 1024 * 1024) {
289
+ await reader.cancel();
290
+ throw new Error("同步响应过大。");
291
+ }
292
+ chunks.push(value);
293
+ }
294
+ }
295
+ finally {
296
+ reader.releaseLock();
297
+ }
298
+ const result = JSON.parse(Buffer.concat(chunks).toString("utf8"));
299
+ if (result.principal !== identity.userId)
300
+ throw new Error("同步用户身份不匹配。");
301
+ return result;
302
+ }
303
+ async close() { this.closed = true; clearInterval(this.timer); this.controller?.abort(); await this.running?.catch(() => { }); }
304
+ }
305
+ export function createMemoryPlugin(options, onReady) {
306
+ return { id: "memory", version: "1.0.0", apiVersion: 1, description: "Local Markdown memory with account Cloud sync and a persistent off switch",
307
+ parseConfig(raw) { if (raw !== undefined && !object(raw))
308
+ throw new Error("Invalid memory config"); return {}; },
309
+ setup(ctx) {
310
+ const service = new MemoryService(options);
311
+ onReady(service);
312
+ const stop = () => { void service.close(); };
313
+ ctx.signal.addEventListener("abort", stop, { once: true });
314
+ ctx.onDispose(async () => { ctx.signal.removeEventListener("abort", stop); await service.close(); });
315
+ for (const tool of createMemoryTools(service.store))
316
+ ctx.tools.register(tool);
317
+ ctx.prompts.register(async () => {
318
+ try {
319
+ return await service.store.promptSection();
320
+ }
321
+ catch {
322
+ ctx.logger.warn("Memory prompt unavailable; check local note files");
323
+ return undefined;
324
+ }
325
+ });
326
+ ctx.pages.register({ id: "memory", title: "Memory", renderer: "memory", read: () => service.status(),
327
+ async act(input) {
328
+ if (input.action === "sync")
329
+ await service.sync();
330
+ else if (input.action === "enable" && typeof input.enabled === "boolean")
331
+ await service.enable(input.enabled);
332
+ else if (input.action === "resolve" && typeof input.id === "string" && typeof input.choice === "string")
333
+ await service.resolve(input.id, input.choice);
334
+ else if (input.action === "save" && object(input.note)) {
335
+ if (input.id) {
336
+ const id = String(input.id), current = (await service.store.load()).find((entry) => entry.id === id);
337
+ if (!current || input.expectedHash !== noteHash(current))
338
+ throw new Error("记忆已改变,请刷新后编辑。");
339
+ await service.store.apply(id, { ...current, ...input.note, id, createdAt: current.createdAt }, noteHash(current));
340
+ }
341
+ else
342
+ await service.store.remember(input.note);
343
+ }
344
+ else if (input.action === "delete" && typeof input.id === "string") {
345
+ const entry = (await service.store.load()).find((one) => one.id === input.id);
346
+ if (!entry || input.expectedHash !== noteHash(entry))
347
+ throw new Error("记忆已改变,请刷新。");
348
+ await writeUserFile("memory-backups/" + digest(service.store.location + entry.id + Date.now()) + ".json", memoryNote(entry));
349
+ await service.store.apply(entry.id, undefined, noteHash(entry));
350
+ }
351
+ else
352
+ throw new Error("未知 Memory 操作。");
353
+ return service.status();
354
+ },
355
+ });
356
+ ctx.onStart(() => service.start());
357
+ },
358
+ };
359
+ }
360
+ //# sourceMappingURL=memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memory.js","sourceRoot":"","sources":["../../../src/runtime-plugins/builtin/memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ import type { ToolContext } from "../tools/types.ts";
2
+ import type { RuntimePlugin } from "./types.ts";
3
+ export interface ConnectionCard {
4
+ id: string;
5
+ session: string;
6
+ toolCallId: string;
7
+ app: string;
8
+ label: string;
9
+ state: "required" | "authorizing" | "connected" | "cancelled" | "failed";
10
+ message: string;
11
+ /**
12
+ * What `message` says, as a key the reading surface can translate.
13
+ *
14
+ * The text is kept beside it because this object also reaches places with no
15
+ * translation table — a log line, a headless run — and a key alone would
16
+ * make those unreadable. Where both exist the key wins, so the card speaks
17
+ * the language the rest of the window is speaking rather than the one this
18
+ * file happened to be written in.
19
+ */
20
+ messageKey?: string;
21
+ /** The app's mark, for the card only. Never reaches the model — see below. */
22
+ logo?: string;
23
+ }
24
+ interface Options {
25
+ token(origin: string): Promise<string | undefined>;
26
+ origin?(): string;
27
+ fetch?: typeof fetch;
28
+ pollMs?: number;
29
+ waitMs?: number;
30
+ }
31
+ export declare class CloudConnectorError extends Error {
32
+ readonly code: string;
33
+ constructor(code: string);
34
+ }
35
+ /** Per-Harness interaction broker. UI sees cards; model never sees authorization URLs. */
36
+ export declare class CloudConnectorService {
37
+ private readonly options;
38
+ private readonly pending;
39
+ private readonly cards;
40
+ private readonly listeners;
41
+ private closed;
42
+ private origin?;
43
+ constructor(options: Options);
44
+ subscribe(listener: (card: ConnectionCard) => void): () => void;
45
+ snapshots(): ConnectionCard[];
46
+ private emit;
47
+ call(action: string, body: object, signal: AbortSignal): Promise<Record<string, any>>;
48
+ requireConnection(app: string, label: string, ctx: ToolContext, principal: string, logo?: string): Promise<void>;
49
+ private finish;
50
+ cancel(id: string): void;
51
+ start(id: string): Promise<string | undefined>;
52
+ private poll;
53
+ close(): void;
54
+ }
55
+ export declare function createCloudConnectorPlugin(service: CloudConnectorService): RuntimePlugin;
56
+ export {};