@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.
- package/README.md +26 -0
- package/dist/agent/agent.d.ts +11 -0
- package/dist/agent/agent.js +30 -9
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/hooks.d.ts +2 -0
- package/dist/agent/hooks.js +11 -0
- package/dist/agent/hooks.js.map +1 -1
- package/dist/agent/memory.d.ts +10 -1
- package/dist/agent/memory.js +147 -49
- package/dist/agent/memory.js.map +1 -1
- package/dist/agent/permissions.js +21 -3
- package/dist/agent/permissions.js.map +1 -1
- package/dist/artifacts/publish.d.ts +2 -2
- package/dist/artifacts/publish.js +2 -2
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/manager.d.ts +14 -0
- package/dist/auth/manager.js +25 -5
- package/dist/auth/manager.js.map +1 -1
- package/dist/auth/providers/account.d.ts +10 -45
- package/dist/auth/providers/account.js +123 -233
- package/dist/auth/providers/account.js.map +1 -1
- package/dist/config-files.d.ts +27 -0
- package/dist/config-files.js +116 -0
- package/dist/config-files.js.map +1 -0
- package/dist/config.d.ts +5 -25
- package/dist/config.js +16 -2
- package/dist/config.js.map +1 -1
- package/dist/core/audit.d.ts +20 -0
- package/dist/core/audit.js +2 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/harness.d.ts +35 -2
- package/dist/harness.js +162 -50
- package/dist/harness.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/registry.d.ts +42 -0
- package/dist/providers/registry.js +71 -9
- package/dist/providers/registry.js.map +1 -1
- package/dist/runtime-plugins/audit.d.ts +11 -0
- package/dist/runtime-plugins/audit.js +31 -0
- package/dist/runtime-plugins/audit.js.map +1 -0
- package/dist/runtime-plugins/builtin/jsonl-audit.d.ts +7 -0
- package/dist/runtime-plugins/builtin/jsonl-audit.js +24 -0
- package/dist/runtime-plugins/builtin/jsonl-audit.js.map +1 -0
- package/dist/runtime-plugins/builtin/memory.d.ts +70 -0
- package/dist/runtime-plugins/builtin/memory.js +360 -0
- package/dist/runtime-plugins/builtin/memory.js.map +1 -0
- package/dist/runtime-plugins/cloud-connector.d.ts +56 -0
- package/dist/runtime-plugins/cloud-connector.js +261 -0
- package/dist/runtime-plugins/cloud-connector.js.map +1 -0
- package/dist/runtime-plugins/composio/client.d.ts +65 -0
- package/dist/runtime-plugins/composio/client.js +190 -0
- package/dist/runtime-plugins/composio/client.js.map +1 -0
- package/dist/runtime-plugins/composio/index.d.ts +23 -0
- package/dist/runtime-plugins/composio/index.js +113 -0
- package/dist/runtime-plugins/composio/index.js.map +1 -0
- package/dist/runtime-plugins/connector.d.ts +15 -0
- package/dist/runtime-plugins/connector.js +17 -0
- package/dist/runtime-plugins/connector.js.map +1 -0
- package/dist/runtime-plugins/extensions.d.ts +21 -0
- package/dist/runtime-plugins/extensions.js +23 -0
- package/dist/runtime-plugins/extensions.js.map +1 -0
- package/dist/runtime-plugins/host.d.ts +34 -0
- package/dist/runtime-plugins/host.js +263 -0
- package/dist/runtime-plugins/host.js.map +1 -0
- package/dist/runtime-plugins/index.d.ts +12 -0
- package/dist/runtime-plugins/index.js +7 -0
- package/dist/runtime-plugins/index.js.map +1 -0
- package/dist/runtime-plugins/loader.d.ts +5 -0
- package/dist/runtime-plugins/loader.js +36 -0
- package/dist/runtime-plugins/loader.js.map +1 -0
- package/dist/runtime-plugins/tool-adapter.d.ts +3 -0
- package/dist/runtime-plugins/tool-adapter.js +13 -0
- package/dist/runtime-plugins/tool-adapter.js.map +1 -0
- package/dist/runtime-plugins/types.d.ts +81 -0
- package/dist/runtime-plugins/types.js +2 -0
- package/dist/runtime-plugins/types.js.map +1 -0
- package/dist/sync/settings.d.ts +2 -0
- package/dist/sync/settings.js +17 -1
- package/dist/sync/settings.js.map +1 -1
- package/dist/tools/registry.d.ts +2 -0
- package/dist/tools/registry.js +10 -0
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/types.d.ts +2 -0
- package/dist/tools/types.js.map +1 -1
- package/official.json +1 -2
- package/package.json +1 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { toolError, toolText } from "../../tools/types.js";
|
|
3
|
+
import { createConnectorPlugin } from "../connector.js";
|
|
4
|
+
import { ComposioClient, record } from "./client.js";
|
|
5
|
+
export { ComposioClient } from "./client.js";
|
|
6
|
+
export function parseComposioConfig(raw) {
|
|
7
|
+
if (!record(raw) || typeof raw.userId !== "string" || !raw.userId.trim() || raw.userId.length > 256 ||
|
|
8
|
+
!Array.isArray(raw.toolkits) || !raw.toolkits.length || raw.toolkits.length > 20) {
|
|
9
|
+
throw new Error("Composio needs a trusted userId and a nonempty toolkit allowlist");
|
|
10
|
+
}
|
|
11
|
+
const apiKeyEnv = raw.apiKeyEnv ?? "COMPOSIO_API_KEY";
|
|
12
|
+
const timeoutMs = raw.timeoutMs ?? 30_000;
|
|
13
|
+
if (typeof apiKeyEnv !== "string" || !/^[A-Z_][A-Z0-9_]*$/.test(apiKeyEnv) ||
|
|
14
|
+
typeof timeoutMs !== "number" || !Number.isInteger(timeoutMs) || timeoutMs < 100 || timeoutMs > 120_000) {
|
|
15
|
+
throw new Error("Invalid Composio API key environment variable or timeout");
|
|
16
|
+
}
|
|
17
|
+
const slugs = new Set();
|
|
18
|
+
const tools = new Set();
|
|
19
|
+
const toolkits = raw.toolkits.map((item) => {
|
|
20
|
+
if (!record(item) || typeof item.slug !== "string" || !/^[a-z][a-z0-9_]{0,63}$/.test(item.slug) || slugs.has(item.slug) ||
|
|
21
|
+
typeof item.connectedAccountId !== "string" || !/^[a-zA-Z0-9_-]{1,128}$/.test(item.connectedAccountId) ||
|
|
22
|
+
typeof item.version !== "string" || !/^(latest|\d{8}_\d+)$/.test(item.version) ||
|
|
23
|
+
!Array.isArray(item.tools) || !item.tools.length)
|
|
24
|
+
throw new Error("Invalid Composio toolkit configuration");
|
|
25
|
+
slugs.add(item.slug);
|
|
26
|
+
for (const slug of item.tools) {
|
|
27
|
+
if (typeof slug !== "string" || !/^[A-Z][A-Z0-9_]{0,127}$/.test(slug) || tools.has(slug)) {
|
|
28
|
+
throw new Error("Composio tool slugs must be explicit and unique");
|
|
29
|
+
}
|
|
30
|
+
tools.add(slug);
|
|
31
|
+
if (tools.size > 40)
|
|
32
|
+
throw new Error("At most 40 Composio tools may be registered per plugin");
|
|
33
|
+
}
|
|
34
|
+
return { slug: item.slug, connectedAccountId: item.connectedAccountId, version: item.version, tools: [...item.tools] };
|
|
35
|
+
});
|
|
36
|
+
return { userId: raw.userId, apiKeyEnv, timeoutMs, toolkits };
|
|
37
|
+
}
|
|
38
|
+
export function composioToolName(slug) {
|
|
39
|
+
const name = `composio__${slug}`;
|
|
40
|
+
return name.length <= 64 ? name : `${name.slice(0, 53)}_${createHash("sha256").update(slug).digest("hex").slice(0, 10)}`;
|
|
41
|
+
}
|
|
42
|
+
/** The API can return JSON Schema or a field map with per-field required flags. */
|
|
43
|
+
function inputSchema(value) {
|
|
44
|
+
if (!record(value))
|
|
45
|
+
throw new Error("Invalid Composio input schema");
|
|
46
|
+
if (value.type === "object" || (value.type === undefined && record(value.properties))) {
|
|
47
|
+
return { ...structuredClone(value), type: "object" };
|
|
48
|
+
}
|
|
49
|
+
if (typeof value.type === "string" || "$ref" in value)
|
|
50
|
+
throw new Error("Composio tool must accept an object");
|
|
51
|
+
const properties = Object.create(null);
|
|
52
|
+
const required = [];
|
|
53
|
+
for (const [name, field] of Object.entries(value)) {
|
|
54
|
+
if (!record(field))
|
|
55
|
+
throw new Error("Invalid Composio field schema");
|
|
56
|
+
const { required: mandatory, ...schema } = field;
|
|
57
|
+
properties[name] = structuredClone({ ...schema, ...(Array.isArray(mandatory) ? { required: mandatory } : {}) });
|
|
58
|
+
if (mandatory === true)
|
|
59
|
+
required.push(name);
|
|
60
|
+
}
|
|
61
|
+
return { type: "object", properties, required };
|
|
62
|
+
}
|
|
63
|
+
/** Uses the same RuntimePlugin protocol; the transport override is only for embedding/tests. */
|
|
64
|
+
export function createComposioPlugin(options = {}) {
|
|
65
|
+
return createConnectorPlugin({
|
|
66
|
+
id: "connector-composio", version: "1.0.0",
|
|
67
|
+
description: "Composio connected accounts and allowlisted third-party tools",
|
|
68
|
+
parseConfig: parseComposioConfig,
|
|
69
|
+
async connect(config, { signal }) {
|
|
70
|
+
const client = new ComposioClient({ ...config, signal, fetch: options.fetch });
|
|
71
|
+
return {
|
|
72
|
+
async tools() {
|
|
73
|
+
const result = [];
|
|
74
|
+
for (const toolkit of config.toolkits) {
|
|
75
|
+
await client.assertAccount(toolkit.connectedAccountId, toolkit.slug);
|
|
76
|
+
for (const slug of toolkit.tools) {
|
|
77
|
+
const metadata = await client.tool(slug, toolkit.version);
|
|
78
|
+
if (metadata.slug !== slug || !record(metadata.toolkit) || metadata.toolkit.slug !== toolkit.slug ||
|
|
79
|
+
typeof metadata.version !== "string" || !/^\d{8}_\d+$/.test(metadata.version) ||
|
|
80
|
+
(toolkit.version !== "latest" && toolkit.version !== metadata.version)) {
|
|
81
|
+
throw new Error("Composio returned an unexpected tool, toolkit, or version");
|
|
82
|
+
}
|
|
83
|
+
const version = metadata.version; // Resolve latest once, pin schema and execution together.
|
|
84
|
+
result.push({
|
|
85
|
+
name: composioToolName(slug),
|
|
86
|
+
description: typeof metadata.description === "string" ? metadata.description.slice(0, 8000) : slug,
|
|
87
|
+
inputSchema: inputSchema(metadata.input_parameters),
|
|
88
|
+
readOnly: false, sessionLocal: false,
|
|
89
|
+
validate(raw) {
|
|
90
|
+
return record(raw) ? { ok: true, value: raw } : { ok: false, error: "Tool arguments must be an object" };
|
|
91
|
+
},
|
|
92
|
+
async execute(raw, call) {
|
|
93
|
+
if (!record(raw))
|
|
94
|
+
return toolError("Tool arguments must be an object");
|
|
95
|
+
// Revalidate ownership/status: revoked or rebound accounts must not keep working.
|
|
96
|
+
await client.assertAccount(toolkit.connectedAccountId, toolkit.slug, call.signal);
|
|
97
|
+
const response = await client.execute(slug, toolkit.connectedAccountId, version, raw, call.signal);
|
|
98
|
+
if (response.successful !== true)
|
|
99
|
+
return toolError("Composio execution failed; inspect its execution log before retrying");
|
|
100
|
+
return toolText(JSON.stringify(response.data ?? null), { connector: "composio", toolSlug: slug, version });
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
},
|
|
107
|
+
close: () => client.close(),
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
export default createComposioPlugin();
|
|
113
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/runtime-plugins/composio/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgB7C,MAAM,UAAU,mBAAmB,CAAC,GAAY;IAC9C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG;QAC/F,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;QACrF,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,kBAAkB,CAAC;IACtD,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;IAC1C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC;QACtE,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,GAAG,IAAI,SAAS,GAAG,OAAO,EAAE,CAAC;QAC5G,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAyB,EAAE;QAChE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YACnH,OAAO,IAAI,CAAC,kBAAkB,KAAK,QAAQ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;YACtG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9E,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;QAChH,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAC9B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzF,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;YACrE,CAAC;YACD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChB,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;QACjG,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;IACzH,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,IAAI,GAAG,aAAa,IAAI,EAAE,CAAC;IACjC,OAAO,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;AAC3H,CAAC;AAED,mFAAmF;AACnF,SAAS,WAAW,CAAC,KAAc;IACjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACrE,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACtF,OAAO,EAAE,GAAG,eAAe,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACvD,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;IAC9G,MAAM,UAAU,GAA4B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACrE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;QACjD,UAAU,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAChH,IAAI,SAAS,KAAK,IAAI;YAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAClD,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,oBAAoB,CAAC,UAAoC,EAAE;IACzE,OAAO,qBAAqB,CAAC;QAC3B,EAAE,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO;QAC1C,WAAW,EAAE,+DAA+D;QAC5E,WAAW,EAAE,mBAAmB;QAChC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE;YAC9B,MAAM,MAAM,GAAG,IAAI,cAAc,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAC/E,OAAO;gBACL,KAAK,CAAC,KAAK;oBACT,MAAM,MAAM,GAAW,EAAE,CAAC;oBAC1B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;wBACtC,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;wBACrE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;4BACjC,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;4BAC1D,IAAI,QAAQ,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI;gCAC7F,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gCAC7E,CAAC,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gCAC3E,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;4BAC/E,CAAC;4BACD,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,0DAA0D;4BAC5F,MAAM,CAAC,IAAI,CAAC;gCACV,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC;gCAC5B,WAAW,EAAE,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI;gCAClG,WAAW,EAAE,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC;gCACnD,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK;gCACpC,QAAQ,CAAC,GAAG;oCACV,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;gCAC3G,CAAC;gCACD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI;oCACrB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;wCAAE,OAAO,SAAS,CAAC,kCAAkC,CAAC,CAAC;oCACvE,kFAAkF;oCAClF,MAAM,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,kBAAkB,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oCAClF,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,kBAAkB,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oCACnG,IAAI,QAAQ,CAAC,UAAU,KAAK,IAAI;wCAAE,OAAO,SAAS,CAAC,sEAAsE,CAAC,CAAC;oCAC3H,OAAO,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gCAC7G,CAAC;6BACF,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBACD,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,KAAK,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE;aAC5B,CAAC;QACJ,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAED,eAAe,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { Tool } from "../tools/types.ts";
|
|
2
|
+
import type { PluginContext, RuntimePlugin } from "./types.ts";
|
|
3
|
+
/** Vendor adapter, not a second plugin protocol. Account binding belongs to the adapter. */
|
|
4
|
+
export interface ConnectorClient {
|
|
5
|
+
tools(): Promise<readonly Tool[]>;
|
|
6
|
+
close(): void | Promise<void>;
|
|
7
|
+
}
|
|
8
|
+
/** Composio/Pipedream SDK wrappers can use this factory or implement RuntimePlugin directly. */
|
|
9
|
+
export declare function createConnectorPlugin<Config>(definition: {
|
|
10
|
+
id: string;
|
|
11
|
+
version: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
parseConfig(raw: unknown): Config;
|
|
14
|
+
connect(config: Config, context: Pick<PluginContext, "signal" | "logger">): Promise<ConnectorClient>;
|
|
15
|
+
}): RuntimePlugin<Config>;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { adaptPluginTool } from "./tool-adapter.js";
|
|
2
|
+
/** Composio/Pipedream SDK wrappers can use this factory or implement RuntimePlugin directly. */
|
|
3
|
+
export function createConnectorPlugin(definition) {
|
|
4
|
+
return {
|
|
5
|
+
id: definition.id, version: definition.version, apiVersion: 1,
|
|
6
|
+
description: definition.description, parseConfig: definition.parseConfig,
|
|
7
|
+
async setup(ctx, config) {
|
|
8
|
+
const client = await definition.connect(config, { signal: ctx.signal, logger: ctx.logger });
|
|
9
|
+
ctx.onDispose(() => client.close());
|
|
10
|
+
for (const tool of await client.tools()) {
|
|
11
|
+
// External calls are never auto-approved merely because the vendor labels them read-only.
|
|
12
|
+
ctx.tools.register(adaptPluginTool(tool, { readOnly: false, sessionLocal: false }));
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=connector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connector.js","sourceRoot":"","sources":["../../src/runtime-plugins/connector.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQpD,gGAAgG;AAChG,MAAM,UAAU,qBAAqB,CAAS,UAM7C;IACC,OAAO;QACL,EAAE,EAAE,UAAU,CAAC,EAAE,EAAE,OAAO,EAAE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,CAAC;QAC7D,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW;QACxE,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM;YACrB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5F,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YACpC,KAAK,MAAM,IAAI,IAAI,MAAM,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC;gBACxC,0FAA0F;gBAC1F,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;YACtF,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** Host-rendered pages, not arbitrary frontend code. */
|
|
2
|
+
export interface PluginPage {
|
|
3
|
+
id: string;
|
|
4
|
+
title: string;
|
|
5
|
+
renderer: "memory";
|
|
6
|
+
read(): Promise<unknown>;
|
|
7
|
+
act(input: Record<string, unknown>): Promise<unknown>;
|
|
8
|
+
}
|
|
9
|
+
export declare class PluginExtensions {
|
|
10
|
+
private readonly prompts;
|
|
11
|
+
private readonly pages;
|
|
12
|
+
registerPrompt(id: string, source: () => Promise<string | undefined>): () => void;
|
|
13
|
+
registerPage(page: PluginPage): () => void;
|
|
14
|
+
promptSections(): Promise<string[]>;
|
|
15
|
+
listPages(): {
|
|
16
|
+
id: string;
|
|
17
|
+
title: string;
|
|
18
|
+
renderer: "memory";
|
|
19
|
+
}[];
|
|
20
|
+
page(id: string): PluginPage | undefined;
|
|
21
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export class PluginExtensions {
|
|
2
|
+
prompts = new Map();
|
|
3
|
+
pages = new Map();
|
|
4
|
+
registerPrompt(id, source) {
|
|
5
|
+
if (this.prompts.has(id))
|
|
6
|
+
throw new Error("Duplicate prompt source");
|
|
7
|
+
this.prompts.set(id, source);
|
|
8
|
+
return () => { this.prompts.delete(id); };
|
|
9
|
+
}
|
|
10
|
+
registerPage(page) {
|
|
11
|
+
if (!/^[a-z][a-z0-9-]{0,63}$/.test(page.id) || this.pages.has(page.id))
|
|
12
|
+
throw new Error("Invalid or duplicate page");
|
|
13
|
+
this.pages.set(page.id, page);
|
|
14
|
+
return () => { this.pages.delete(page.id); };
|
|
15
|
+
}
|
|
16
|
+
async promptSections() {
|
|
17
|
+
const sections = await Promise.all([...this.prompts.values()].map((read) => read()));
|
|
18
|
+
return sections.filter((x) => typeof x === "string" && !!x);
|
|
19
|
+
}
|
|
20
|
+
listPages() { return [...this.pages.values()].map(({ id, title, renderer }) => ({ id, title, renderer })); }
|
|
21
|
+
page(id) { return this.pages.get(id); }
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=extensions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../src/runtime-plugins/extensions.ts"],"names":[],"mappings":"AAQA,MAAM,OAAO,gBAAgB;IACV,OAAO,GAAG,IAAI,GAAG,EAA6C,CAAC;IAC/D,KAAK,GAAG,IAAI,GAAG,EAAsB,CAAC;IACvD,cAAc,CAAC,EAAU,EAAE,MAAyC;QAClE,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACrE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IACD,YAAY,CAAC,IAAgB;QAC3B,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QACrH,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAAC,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,KAAK,CAAC,cAAc;QAClB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACrF,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;IACD,SAAS,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,IAAI,CAAC,EAAU,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;CAChD"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { AuthManager } from "../auth/manager.ts";
|
|
2
|
+
import type { HookRegistry } from "../agent/hooks.ts";
|
|
3
|
+
import type { ProviderRegistry } from "../providers/registry.ts";
|
|
4
|
+
import type { ToolRegistry } from "../tools/registry.ts";
|
|
5
|
+
import type { Logger } from "../util/logger.ts";
|
|
6
|
+
import type { RuntimeAuditBus } from "./audit.ts";
|
|
7
|
+
import { PluginExtensions } from "./extensions.ts";
|
|
8
|
+
import type { RuntimePluginConfig, RuntimePluginRegistration, RuntimePluginStatus } from "./types.ts";
|
|
9
|
+
interface Services {
|
|
10
|
+
tools: ToolRegistry;
|
|
11
|
+
hooks: HookRegistry;
|
|
12
|
+
models: ProviderRegistry;
|
|
13
|
+
auth: AuthManager;
|
|
14
|
+
audit: RuntimeAuditBus;
|
|
15
|
+
logger: Logger;
|
|
16
|
+
extensions?: PluginExtensions;
|
|
17
|
+
}
|
|
18
|
+
/** Trusted in-process plugins, configured at boot; no live unload or DI graph. */
|
|
19
|
+
export declare class PluginHost {
|
|
20
|
+
private readonly services;
|
|
21
|
+
private readonly instances;
|
|
22
|
+
private booted;
|
|
23
|
+
private closing?;
|
|
24
|
+
constructor(services: Services);
|
|
25
|
+
status(): RuntimePluginStatus[];
|
|
26
|
+
boot(inline?: RuntimePluginRegistration[], configured?: RuntimePluginConfig[]): Promise<void>;
|
|
27
|
+
private fail;
|
|
28
|
+
private context;
|
|
29
|
+
close(): Promise<void>;
|
|
30
|
+
private shutdown;
|
|
31
|
+
private dispose;
|
|
32
|
+
private bounded;
|
|
33
|
+
}
|
|
34
|
+
export {};
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { ConfigError } from "../core/errors.js";
|
|
2
|
+
import { loadRuntimePlugin, validatePluginId, validateRuntimePlugin } from "./loader.js";
|
|
3
|
+
import { adaptPluginTool } from "./tool-adapter.js";
|
|
4
|
+
import { PluginExtensions } from "./extensions.js";
|
|
5
|
+
/** Trusted in-process plugins, configured at boot; no live unload or DI graph. */
|
|
6
|
+
export class PluginHost {
|
|
7
|
+
services;
|
|
8
|
+
instances = [];
|
|
9
|
+
booted = false;
|
|
10
|
+
closing;
|
|
11
|
+
constructor(services) { this.services = services; }
|
|
12
|
+
status() {
|
|
13
|
+
return this.instances.map(({ status }) => ({ ...status, contributions: { ...status.contributions } }));
|
|
14
|
+
}
|
|
15
|
+
async boot(inline = [], configured = []) {
|
|
16
|
+
if (this.booted || this.closing)
|
|
17
|
+
throw new ConfigError("PluginHost can only boot once");
|
|
18
|
+
this.booted = true;
|
|
19
|
+
const entries = new Map();
|
|
20
|
+
for (const registration of inline) {
|
|
21
|
+
validatePluginId(registration.plugin?.id);
|
|
22
|
+
const id = registration.plugin.id;
|
|
23
|
+
if (entries.has(id))
|
|
24
|
+
throw new ConfigError(`duplicate runtime plugin: ${id}`);
|
|
25
|
+
entries.set(id, { plugin: registration.plugin, config: {
|
|
26
|
+
id, config: registration.config, enabled: registration.enabled, required: registration.required,
|
|
27
|
+
} });
|
|
28
|
+
}
|
|
29
|
+
const configuredIds = new Set();
|
|
30
|
+
for (const config of configured) {
|
|
31
|
+
validatePluginId(config?.id);
|
|
32
|
+
if (configuredIds.has(config.id))
|
|
33
|
+
throw new ConfigError(`duplicate runtime plugin config: ${config.id}`);
|
|
34
|
+
configuredIds.add(config.id);
|
|
35
|
+
const entry = entries.get(config.id);
|
|
36
|
+
if (entry?.plugin && config.module)
|
|
37
|
+
throw new ConfigError(`runtime plugin has two implementations: ${config.id}`);
|
|
38
|
+
entries.set(config.id, { plugin: entry?.plugin, config: { ...entry?.config, ...config } });
|
|
39
|
+
}
|
|
40
|
+
for (const { config } of entries.values()) {
|
|
41
|
+
if ((config.enabled !== undefined && typeof config.enabled !== "boolean") ||
|
|
42
|
+
(config.required !== undefined && typeof config.required !== "boolean")) {
|
|
43
|
+
throw new ConfigError("Runtime plugin enabled and required must be booleans");
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
for (const [id, { plugin: supplied, config }] of entries) {
|
|
48
|
+
const instance = {
|
|
49
|
+
status: {
|
|
50
|
+
id, required: config.required !== false,
|
|
51
|
+
state: config.enabled === false ? "disabled" : "loading",
|
|
52
|
+
contributions: { tools: 0, models: 0, auth: 0, hooks: 0, audit: 0, prompts: 0, pages: 0 },
|
|
53
|
+
},
|
|
54
|
+
controller: new AbortController(), registrations: [], resources: [], starts: [], calls: new Set(),
|
|
55
|
+
};
|
|
56
|
+
this.instances.push(instance);
|
|
57
|
+
if (config.enabled === false)
|
|
58
|
+
continue; // Do not even import disabled code.
|
|
59
|
+
try {
|
|
60
|
+
const plugin = supplied ?? (config.module ? await loadRuntimePlugin(config.module) : undefined);
|
|
61
|
+
if (!plugin)
|
|
62
|
+
throw new Error("Missing plugin implementation");
|
|
63
|
+
validateRuntimePlugin(plugin, id);
|
|
64
|
+
instance.status.version = plugin.version;
|
|
65
|
+
instance.status.description = plugin.description;
|
|
66
|
+
const parsed = plugin.parseConfig(config.config);
|
|
67
|
+
instance.status.state = "setting-up";
|
|
68
|
+
await plugin.setup(this.context(instance), parsed);
|
|
69
|
+
instance.status.state = "ready";
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
await this.fail(instance, "Plugin setup failed; check implementation and configuration");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
for (const instance of this.instances) {
|
|
76
|
+
if (instance.status.state !== "ready")
|
|
77
|
+
continue;
|
|
78
|
+
try {
|
|
79
|
+
instance.status.state = "starting";
|
|
80
|
+
for (const start of instance.starts)
|
|
81
|
+
await start();
|
|
82
|
+
instance.status.state = "active";
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
await this.fail(instance, "Plugin start failed");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
await this.close();
|
|
91
|
+
throw error;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
async fail(instance, error) {
|
|
95
|
+
instance.status.state = "failed";
|
|
96
|
+
instance.status.error = error;
|
|
97
|
+
await this.dispose(instance);
|
|
98
|
+
this.services.logger.warn(error, { pluginId: instance.status.id });
|
|
99
|
+
if (instance.status.required)
|
|
100
|
+
throw new ConfigError(`Required plugin ${instance.status.id}: ${error}`);
|
|
101
|
+
}
|
|
102
|
+
context(instance) {
|
|
103
|
+
const { services } = this;
|
|
104
|
+
const signal = instance.controller.signal;
|
|
105
|
+
const register = (kind, effect, count = 1) => {
|
|
106
|
+
if (instance.status.state !== "setting-up")
|
|
107
|
+
throw new Error("Contributions must be registered during setup");
|
|
108
|
+
instance.registrations.push(effect());
|
|
109
|
+
instance.status.contributions[kind] += count;
|
|
110
|
+
};
|
|
111
|
+
const enter = () => {
|
|
112
|
+
if (signal.aborted || !["starting", "active"].includes(instance.status.state)) {
|
|
113
|
+
throw new Error(`Plugin ${instance.status.id} is not active`);
|
|
114
|
+
}
|
|
115
|
+
let finish;
|
|
116
|
+
const done = new Promise((resolve) => { finish = resolve; });
|
|
117
|
+
instance.calls.add(done);
|
|
118
|
+
return () => { instance.calls.delete(done); finish(); };
|
|
119
|
+
};
|
|
120
|
+
return Object.freeze({
|
|
121
|
+
pluginId: instance.status.id,
|
|
122
|
+
logger: services.logger.child(instance.status.id),
|
|
123
|
+
signal,
|
|
124
|
+
tools: Object.freeze({ register: (tool) => register("tools", () => services.tools.registerScoped(adaptPluginTool(tool, {
|
|
125
|
+
source: "custom", pluginId: instance.status.id,
|
|
126
|
+
execute: async (input, ctx) => {
|
|
127
|
+
const leave = enter();
|
|
128
|
+
try {
|
|
129
|
+
return await tool.execute(input, { ...ctx, signal: AbortSignal.any([signal, ctx.signal]) });
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
leave();
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
}))) }),
|
|
136
|
+
hooks: Object.freeze({ on: (event, handler) => register("hooks", () => services.hooks.subscribe(event, async (payload) => {
|
|
137
|
+
if (signal.aborted || instance.status.state !== "active")
|
|
138
|
+
return;
|
|
139
|
+
const leave = enter();
|
|
140
|
+
try {
|
|
141
|
+
return await handler(payload);
|
|
142
|
+
}
|
|
143
|
+
finally {
|
|
144
|
+
leave();
|
|
145
|
+
}
|
|
146
|
+
})) }),
|
|
147
|
+
models: Object.freeze({ register: (provider, models) => register("models", () => {
|
|
148
|
+
const guarded = {
|
|
149
|
+
id: provider.id, name: provider.name,
|
|
150
|
+
isConfigured: () => !signal.aborted && provider.isConfigured(),
|
|
151
|
+
async *stream(request) {
|
|
152
|
+
const leave = enter();
|
|
153
|
+
try {
|
|
154
|
+
yield* provider.stream({ ...request, signal: AbortSignal.any([signal, ...(request.signal ? [request.signal] : [])]) });
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
leave();
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
...(provider.listModels ? { listModels: async () => {
|
|
161
|
+
const leave = enter();
|
|
162
|
+
try {
|
|
163
|
+
return await provider.listModels();
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
leave();
|
|
167
|
+
}
|
|
168
|
+
} } : {}),
|
|
169
|
+
};
|
|
170
|
+
return services.models.registerScoped(guarded, models);
|
|
171
|
+
}, models.length) }),
|
|
172
|
+
auth: Object.freeze({ register: (provider) => register("auth", () => services.auth.registerScoped(provider)) }),
|
|
173
|
+
audit: Object.freeze({ registerSink: (sink) => register("audit", () => services.audit.register(sink)) }),
|
|
174
|
+
prompts: Object.freeze({ register: (source) => register("prompts", () => {
|
|
175
|
+
if (!services.extensions)
|
|
176
|
+
throw new Error("Prompt extensions unavailable");
|
|
177
|
+
return services.extensions.registerPrompt(instance.status.id, async () => {
|
|
178
|
+
const leave = enter();
|
|
179
|
+
try {
|
|
180
|
+
return await source();
|
|
181
|
+
}
|
|
182
|
+
finally {
|
|
183
|
+
leave();
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
}) }),
|
|
187
|
+
pages: Object.freeze({ register: (page) => register("pages", () => {
|
|
188
|
+
if (!services.extensions)
|
|
189
|
+
throw new Error("Page extensions unavailable");
|
|
190
|
+
return services.extensions.registerPage({ ...page,
|
|
191
|
+
read: async () => { const leave = enter(); try {
|
|
192
|
+
return await page.read();
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
leave();
|
|
196
|
+
} },
|
|
197
|
+
act: async (input) => { const leave = enter(); try {
|
|
198
|
+
return await page.act(input);
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
leave();
|
|
202
|
+
} },
|
|
203
|
+
});
|
|
204
|
+
}) }),
|
|
205
|
+
onStart: (start) => {
|
|
206
|
+
if (instance.status.state !== "setting-up")
|
|
207
|
+
throw new Error("onStart must be registered during setup");
|
|
208
|
+
instance.starts.push(start);
|
|
209
|
+
},
|
|
210
|
+
onDispose: (cleanup) => {
|
|
211
|
+
if (signal.aborted)
|
|
212
|
+
throw new Error("Plugin is already stopping");
|
|
213
|
+
instance.resources.push(cleanup);
|
|
214
|
+
},
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
close() {
|
|
218
|
+
return this.closing ??= this.shutdown();
|
|
219
|
+
}
|
|
220
|
+
async shutdown() {
|
|
221
|
+
// Signal all plugins first; a resource owned by another plugin may be waiting.
|
|
222
|
+
for (const instance of this.instances) {
|
|
223
|
+
instance.controller.abort();
|
|
224
|
+
if (!["failed", "disabled", "stopped"].includes(instance.status.state))
|
|
225
|
+
instance.status.state = "stopping";
|
|
226
|
+
}
|
|
227
|
+
await Promise.all(this.instances.map((instance) => this.bounded(() => Promise.all(instance.calls).then(() => { }), instance)));
|
|
228
|
+
for (const instance of [...this.instances].reverse()) {
|
|
229
|
+
await this.dispose(instance, false);
|
|
230
|
+
if (instance.status.state === "stopping")
|
|
231
|
+
instance.status.state = "stopped";
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
async dispose(instance, drain = true) {
|
|
235
|
+
instance.controller.abort();
|
|
236
|
+
if (drain)
|
|
237
|
+
await this.bounded(() => Promise.all(instance.calls).then(() => { }), instance);
|
|
238
|
+
// Stop new observations and drain audit queues before closing the sink's file/client.
|
|
239
|
+
for (const cleanup of instance.registrations.splice(0).reverse())
|
|
240
|
+
await this.bounded(cleanup, instance);
|
|
241
|
+
for (const cleanup of instance.resources.splice(0).reverse())
|
|
242
|
+
await this.bounded(cleanup, instance);
|
|
243
|
+
instance.starts.length = 0;
|
|
244
|
+
instance.status.contributions = { tools: 0, models: 0, auth: 0, hooks: 0, audit: 0, prompts: 0, pages: 0 };
|
|
245
|
+
}
|
|
246
|
+
async bounded(cleanup, instance) {
|
|
247
|
+
let timer;
|
|
248
|
+
try {
|
|
249
|
+
await Promise.race([
|
|
250
|
+
Promise.resolve().then(cleanup),
|
|
251
|
+
new Promise((_, reject) => { timer = setTimeout(() => reject(new Error("timeout")), 5000); }),
|
|
252
|
+
]);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
instance.status.error = "Plugin cleanup failed or timed out";
|
|
256
|
+
this.services.logger.warn("Plugin cleanup failed or timed out", { pluginId: instance.status.id });
|
|
257
|
+
}
|
|
258
|
+
finally {
|
|
259
|
+
clearTimeout(timer);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../../src/runtime-plugins/host.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type { RuntimePlugin, RuntimePluginConfig, RuntimePluginRegistration, RuntimePluginStatus, PluginContext, PluginState, Dispose } from "./types.ts";
|
|
2
|
+
export type { AuditSink, RuntimeAuditEvent } from "../core/audit.ts";
|
|
3
|
+
export { createConnectorPlugin } from "./connector.ts";
|
|
4
|
+
export { CloudConnectorService, createCloudConnectorPlugin } from "./cloud-connector.ts";
|
|
5
|
+
export { createMemoryPlugin, MemoryService } from "./builtin/memory.ts";
|
|
6
|
+
export { PluginExtensions } from "./extensions.ts";
|
|
7
|
+
export type { PluginPage } from "./extensions.ts";
|
|
8
|
+
export type { ConnectionCard } from "./cloud-connector.ts";
|
|
9
|
+
export type { ConnectorClient } from "./connector.ts";
|
|
10
|
+
export { default as jsonlAuditPlugin } from "./builtin/jsonl-audit.ts";
|
|
11
|
+
export { default as composioPlugin, createComposioPlugin, ComposioClient, composioToolName } from "./composio/index.ts";
|
|
12
|
+
export type { ComposioPluginConfig, ComposioToolkitConfig, ComposioClientOptions, ComposioAccount, ComposioAuthLink } from "./composio/index.ts";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createConnectorPlugin } from "./connector.js";
|
|
2
|
+
export { CloudConnectorService, createCloudConnectorPlugin } from "./cloud-connector.js";
|
|
3
|
+
export { createMemoryPlugin, MemoryService } from "./builtin/memory.js";
|
|
4
|
+
export { PluginExtensions } from "./extensions.js";
|
|
5
|
+
export { default as jsonlAuditPlugin } from "./builtin/jsonl-audit.js";
|
|
6
|
+
export { default as composioPlugin, createComposioPlugin, ComposioClient, composioToolName } from "./composio/index.js";
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime-plugins/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,0BAA0B,EAAE,MAAM,sBAAsB,CAAC;AACzF,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAInD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,oBAAoB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { RuntimePlugin } from "./types.ts";
|
|
2
|
+
export declare function validatePluginId(id: unknown): asserts id is string;
|
|
3
|
+
/** Called only after configuration has been approved and enabled checked. */
|
|
4
|
+
export declare function loadRuntimePlugin(module: string): Promise<RuntimePlugin>;
|
|
5
|
+
export declare function validateRuntimePlugin(plugin: RuntimePlugin, expectedId: string): void;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
|
|
2
|
+
if (typeof path === "string" && /^\.\.?\//.test(path)) {
|
|
3
|
+
return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
|
|
4
|
+
return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
return path;
|
|
8
|
+
};
|
|
9
|
+
import path from "node:path";
|
|
10
|
+
import { createRequire } from "node:module";
|
|
11
|
+
import { pathToFileURL } from "node:url";
|
|
12
|
+
import { userPath } from "../paths.js";
|
|
13
|
+
export function validatePluginId(id) {
|
|
14
|
+
if (typeof id !== "string" || !/^[a-z0-9][a-z0-9._-]*$/.test(id)) {
|
|
15
|
+
throw new Error("Plugin id must contain lowercase letters, numbers, dots, underscores or hyphens");
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
/** Called only after configuration has been approved and enabled checked. */
|
|
19
|
+
export async function loadRuntimePlugin(module) {
|
|
20
|
+
if (typeof module !== "string" || !module || module.startsWith(".") || /^[a-z]+:/i.test(module)) {
|
|
21
|
+
throw new Error("Plugin module must be an absolute path or installed package name");
|
|
22
|
+
}
|
|
23
|
+
const file = path.isAbsolute(module)
|
|
24
|
+
? module
|
|
25
|
+
: createRequire(userPath("runtime-plugins.cjs")).resolve(module);
|
|
26
|
+
const imported = await import(__rewriteRelativeImportExtension(pathToFileURL(file).href));
|
|
27
|
+
return imported.default;
|
|
28
|
+
}
|
|
29
|
+
export function validateRuntimePlugin(plugin, expectedId) {
|
|
30
|
+
if (!plugin || plugin.id !== expectedId || plugin.apiVersion !== 1 ||
|
|
31
|
+
typeof plugin.version !== "string" || !plugin.version ||
|
|
32
|
+
typeof plugin.parseConfig !== "function" || typeof plugin.setup !== "function") {
|
|
33
|
+
throw new Error("Invalid runtime plugin definition or unsupported API version");
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/runtime-plugins/loader.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,UAAU,gBAAgB,CAAC,EAAW;IAC1C,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;IACrG,CAAC;AACH,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAc;IACpD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAChG,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAClC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,MAAM,QAAQ,GAAG,MAAM,MAAM,kCAAC,aAAa,CAAC,IAAI,CAAC,CAAC,IAAI,EAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,OAAO,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAqB,EAAE,UAAkB;IAC7E,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,EAAE,KAAK,UAAU,IAAI,MAAM,CAAC,UAAU,KAAK,CAAC;QAC9D,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO;QACrD,OAAO,MAAM,CAAC,WAAW,KAAK,UAAU,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;QACnF,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;IAClF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Preserve class getters and prototype methods; object spread silently loses them. */
|
|
2
|
+
export function adaptPluginTool(tool, overrides) {
|
|
3
|
+
return {
|
|
4
|
+
name: tool.name, description: tool.description, inputSchema: tool.inputSchema,
|
|
5
|
+
readOnly: tool.readOnly, concurrencySafe: tool.concurrencySafe,
|
|
6
|
+
sessionLocal: tool.sessionLocal, hidden: tool.hidden,
|
|
7
|
+
source: tool.source, server: tool.server, pluginId: tool.pluginId,
|
|
8
|
+
validate: tool.validate?.bind(tool), renderTitle: tool.renderTitle?.bind(tool),
|
|
9
|
+
execute: tool.execute.bind(tool),
|
|
10
|
+
...overrides,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=tool-adapter.js.map
|