@intentic/providers 1.18.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/LICENSE +21 -0
- package/README.md +26 -0
- package/dist/app.d.ts +4 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +72 -0
- package/dist/app.js.map +1 -0
- package/dist/authentik-api.d.ts +23 -0
- package/dist/authentik-api.d.ts.map +1 -0
- package/dist/authentik-api.js +67 -0
- package/dist/authentik-api.js.map +1 -0
- package/dist/authentik-client.d.ts +4 -0
- package/dist/authentik-client.d.ts.map +1 -0
- package/dist/authentik-client.js +50 -0
- package/dist/authentik-client.js.map +1 -0
- package/dist/authentik.d.ts +4 -0
- package/dist/authentik.d.ts.map +1 -0
- package/dist/authentik.js +132 -0
- package/dist/authentik.js.map +1 -0
- package/dist/backing-ssh.d.ts +8 -0
- package/dist/backing-ssh.d.ts.map +1 -0
- package/dist/backing-ssh.js +44 -0
- package/dist/backing-ssh.js.map +1 -0
- package/dist/backup-restore.d.ts +15 -0
- package/dist/backup-restore.d.ts.map +1 -0
- package/dist/backup-restore.js +49 -0
- package/dist/backup-restore.js.map +1 -0
- package/dist/backup.d.ts +4 -0
- package/dist/backup.d.ts.map +1 -0
- package/dist/backup.js +150 -0
- package/dist/backup.js.map +1 -0
- package/dist/cf-route.d.ts +5 -0
- package/dist/cf-route.d.ts.map +1 -0
- package/dist/cf-route.js +74 -0
- package/dist/cf-route.js.map +1 -0
- package/dist/ci.d.ts +4 -0
- package/dist/ci.d.ts.map +1 -0
- package/dist/ci.js +151 -0
- package/dist/ci.js.map +1 -0
- package/dist/cloudflare-api.d.ts +85 -0
- package/dist/cloudflare-api.d.ts.map +1 -0
- package/dist/cloudflare-api.js +110 -0
- package/dist/cloudflare-api.js.map +1 -0
- package/dist/cloudflare.d.ts +4 -0
- package/dist/cloudflare.d.ts.map +1 -0
- package/dist/cloudflare.js +29 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/deploy-hook.d.ts +4 -0
- package/dist/deploy-hook.d.ts.map +1 -0
- package/dist/deploy-hook.js +79 -0
- package/dist/deploy-hook.js.map +1 -0
- package/dist/deployment.d.ts +4 -0
- package/dist/deployment.d.ts.map +1 -0
- package/dist/deployment.js +103 -0
- package/dist/deployment.js.map +1 -0
- package/dist/discord-api.d.ts +31 -0
- package/dist/discord-api.d.ts.map +1 -0
- package/dist/discord-api.js +85 -0
- package/dist/discord-api.js.map +1 -0
- package/dist/discord.d.ts +4 -0
- package/dist/discord.d.ts.map +1 -0
- package/dist/discord.js +133 -0
- package/dist/discord.js.map +1 -0
- package/dist/forgejo-api.d.ts +209 -0
- package/dist/forgejo-api.d.ts.map +1 -0
- package/dist/forgejo-api.fake.d.ts +3 -0
- package/dist/forgejo-api.fake.d.ts.map +1 -0
- package/dist/forgejo-api.fake.js +31 -0
- package/dist/forgejo-api.fake.js.map +1 -0
- package/dist/forgejo-api.js +181 -0
- package/dist/forgejo-api.js.map +1 -0
- package/dist/forgejo-notify.d.ts +4 -0
- package/dist/forgejo-notify.d.ts.map +1 -0
- package/dist/forgejo-notify.js +103 -0
- package/dist/forgejo-notify.js.map +1 -0
- package/dist/forgejo-org.d.ts +4 -0
- package/dist/forgejo-org.d.ts.map +1 -0
- package/dist/forgejo-org.js +43 -0
- package/dist/forgejo-org.js.map +1 -0
- package/dist/forgejo-runner.d.ts +4 -0
- package/dist/forgejo-runner.d.ts.map +1 -0
- package/dist/forgejo-runner.js +111 -0
- package/dist/forgejo-runner.js.map +1 -0
- package/dist/forgejo-team.d.ts +4 -0
- package/dist/forgejo-team.d.ts.map +1 -0
- package/dist/forgejo-team.js +68 -0
- package/dist/forgejo-team.js.map +1 -0
- package/dist/forgejo-user.d.ts +4 -0
- package/dist/forgejo-user.d.ts.map +1 -0
- package/dist/forgejo-user.js +50 -0
- package/dist/forgejo-user.js.map +1 -0
- package/dist/forgejo.d.ts +4 -0
- package/dist/forgejo.d.ts.map +1 -0
- package/dist/forgejo.js +169 -0
- package/dist/forgejo.js.map +1 -0
- package/dist/garage-bucket.d.ts +4 -0
- package/dist/garage-bucket.d.ts.map +1 -0
- package/dist/garage-bucket.js +92 -0
- package/dist/garage-bucket.js.map +1 -0
- package/dist/garage.d.ts +4 -0
- package/dist/garage.d.ts.map +1 -0
- package/dist/garage.js +124 -0
- package/dist/garage.js.map +1 -0
- package/dist/gh-ci.d.ts +4 -0
- package/dist/gh-ci.d.ts.map +1 -0
- package/dist/gh-ci.js +153 -0
- package/dist/gh-ci.js.map +1 -0
- package/dist/gh-deployment.d.ts +4 -0
- package/dist/gh-deployment.d.ts.map +1 -0
- package/dist/gh-deployment.js +92 -0
- package/dist/gh-deployment.js.map +1 -0
- package/dist/gh-repo.d.ts +4 -0
- package/dist/gh-repo.d.ts.map +1 -0
- package/dist/gh-repo.js +52 -0
- package/dist/gh-repo.js.map +1 -0
- package/dist/github-api.d.ts +70 -0
- package/dist/github-api.d.ts.map +1 -0
- package/dist/github-api.js +120 -0
- package/dist/github-api.js.map +1 -0
- package/dist/github.d.ts +4 -0
- package/dist/github.d.ts.map +1 -0
- package/dist/github.js +34 -0
- package/dist/github.js.map +1 -0
- package/dist/guarded-update.d.ts +14 -0
- package/dist/guarded-update.d.ts.map +1 -0
- package/dist/guarded-update.js +25 -0
- package/dist/guarded-update.js.map +1 -0
- package/dist/host.d.ts +4 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +48 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/inputs.d.ts +23 -0
- package/dist/inputs.d.ts.map +1 -0
- package/dist/inputs.js +34 -0
- package/dist/inputs.js.map +1 -0
- package/dist/komodo-api.d.ts +150 -0
- package/dist/komodo-api.d.ts.map +1 -0
- package/dist/komodo-api.js +104 -0
- package/dist/komodo-api.js.map +1 -0
- package/dist/komodo-notify.d.ts +4 -0
- package/dist/komodo-notify.d.ts.map +1 -0
- package/dist/komodo-notify.js +88 -0
- package/dist/komodo-notify.js.map +1 -0
- package/dist/komodo-periphery.d.ts +4 -0
- package/dist/komodo-periphery.d.ts.map +1 -0
- package/dist/komodo-periphery.js +92 -0
- package/dist/komodo-periphery.js.map +1 -0
- package/dist/komodo-server.d.ts +4 -0
- package/dist/komodo-server.d.ts.map +1 -0
- package/dist/komodo-server.js +54 -0
- package/dist/komodo-server.js.map +1 -0
- package/dist/komodo-user.d.ts +4 -0
- package/dist/komodo-user.d.ts.map +1 -0
- package/dist/komodo-user.js +66 -0
- package/dist/komodo-user.js.map +1 -0
- package/dist/komodo.d.ts +4 -0
- package/dist/komodo.d.ts.map +1 -0
- package/dist/komodo.js +222 -0
- package/dist/komodo.js.map +1 -0
- package/dist/postgres-database.d.ts +4 -0
- package/dist/postgres-database.d.ts.map +1 -0
- package/dist/postgres-database.js +88 -0
- package/dist/postgres-database.js.map +1 -0
- package/dist/postgres.d.ts +4 -0
- package/dist/postgres.d.ts.map +1 -0
- package/dist/postgres.js +95 -0
- package/dist/postgres.js.map +1 -0
- package/dist/providers.d.ts +21 -0
- package/dist/providers.d.ts.map +1 -0
- package/dist/providers.js +86 -0
- package/dist/providers.js.map +1 -0
- package/dist/repo.d.ts +4 -0
- package/dist/repo.d.ts.map +1 -0
- package/dist/repo.js +80 -0
- package/dist/repo.js.map +1 -0
- package/dist/signoz.d.ts +4 -0
- package/dist/signoz.d.ts.map +1 -0
- package/dist/signoz.js +386 -0
- package/dist/signoz.js.map +1 -0
- package/dist/ssh-probe.d.ts +5 -0
- package/dist/ssh-probe.d.ts.map +1 -0
- package/dist/ssh-probe.js +22 -0
- package/dist/ssh-probe.js.map +1 -0
- package/dist/ssh.d.ts +27 -0
- package/dist/ssh.d.ts.map +1 -0
- package/dist/ssh.js +79 -0
- package/dist/ssh.js.map +1 -0
- package/dist/tunnel.d.ts +5 -0
- package/dist/tunnel.d.ts.map +1 -0
- package/dist/tunnel.js +126 -0
- package/dist/tunnel.js.map +1 -0
- package/dist/valkey-namespace.d.ts +4 -0
- package/dist/valkey-namespace.d.ts.map +1 -0
- package/dist/valkey-namespace.js +78 -0
- package/dist/valkey-namespace.js.map +1 -0
- package/dist/valkey.d.ts +4 -0
- package/dist/valkey.d.ts.map +1 -0
- package/dist/valkey.js +94 -0
- package/dist/valkey.js.map +1 -0
- package/dist/workspace.d.ts +4 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +97 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +53 -0
package/dist/ssh.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssh.js","sourceRoot":"","sources":["../src/ssh.ts"],"names":[],"mappings":"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"}
|
package/dist/tunnel.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Provider } from "@intentic/engine";
|
|
2
|
+
import type { CloudflareApi } from "./cloudflare-api.js";
|
|
3
|
+
import type { SshExecutor } from "./ssh.js";
|
|
4
|
+
export declare const createTunnelProvider: (api?: CloudflareApi, executor?: SshExecutor) => Provider;
|
|
5
|
+
//# sourceMappingURL=tunnel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAmC,MAAM,kBAAkB,CAAC;AAElF,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,qBAAqB,CAAC;AAGtE,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,UAAU,CAAC;AA2FxD,eAAO,MAAM,oBAAoB,GAAI,MAAK,aAA6B,EAAE,WAAU,WAAyB,KAAG,QA8D7G,CAAC"}
|
package/dist/tunnel.js
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { cloudflareApi } from "./cloudflare-api.js";
|
|
3
|
+
import { parseInputs, sshSchema, sshTarget } from "./inputs.js";
|
|
4
|
+
import { sshExecutor } from "./ssh.js";
|
|
5
|
+
const tunnelSchema = sshSchema.extend({
|
|
6
|
+
name: z.string(),
|
|
7
|
+
accountId: z.string(),
|
|
8
|
+
apiToken: z.string(),
|
|
9
|
+
internalIp: z.string(),
|
|
10
|
+
ingress: z.array(z.object({ hostname: z.string(), port: z.coerce.number() })),
|
|
11
|
+
image: z.string(),
|
|
12
|
+
});
|
|
13
|
+
const parse = (inputs) => parseInputs(tunnelSchema, inputs, "tunnel");
|
|
14
|
+
const CATCH_ALL = { service: "http_status:404" };
|
|
15
|
+
const desiredRules = (parsed) => [
|
|
16
|
+
...parsed.ingress.map((rule) => ({ hostname: rule.hostname, service: `http://${parsed.internalIp}:${rule.port}` })),
|
|
17
|
+
CATCH_ALL,
|
|
18
|
+
];
|
|
19
|
+
const cname = (tunnelId) => `${tunnelId}.cfargotunnel.com`;
|
|
20
|
+
const containerName = (tunnelId) => `intentic-tunnel-${tunnelId}`;
|
|
21
|
+
const ingressEqual = (a, b) => {
|
|
22
|
+
if (a.length !== b.length) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
return a.every((rule, index) => {
|
|
26
|
+
const other = b[index];
|
|
27
|
+
return other !== undefined && rule.hostname === other.hostname && rule.service === other.service;
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
const checkConnector = async (executor, parsed, tunnelId, ctx) => {
|
|
31
|
+
let session;
|
|
32
|
+
try {
|
|
33
|
+
session = await executor.connect(sshTarget(parsed));
|
|
34
|
+
}
|
|
35
|
+
catch (error) {
|
|
36
|
+
ctx.log(`tunnel "${ctx.id}": host not reachable over SSH to check the connector: ${String(error)}`);
|
|
37
|
+
return { running: false, image: undefined };
|
|
38
|
+
}
|
|
39
|
+
try {
|
|
40
|
+
const name = containerName(tunnelId);
|
|
41
|
+
const result = await session.exec(`docker ps --filter "name=^${name}$" --format '{{.Names}}'`);
|
|
42
|
+
if (result.stdout.trim() !== name) {
|
|
43
|
+
return { running: false, image: undefined };
|
|
44
|
+
}
|
|
45
|
+
const image = (await session.exec(`docker inspect --format '{{.Config.Image}}' ${name} 2>/dev/null || true`)).stdout.trim();
|
|
46
|
+
return { running: true, image };
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
await session.dispose();
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const runConnector = async (executor, parsed, tunnelId, token) => {
|
|
53
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
54
|
+
try {
|
|
55
|
+
const name = containerName(tunnelId);
|
|
56
|
+
await session.exec(`docker rm -f ${name} 2>/dev/null || true`);
|
|
57
|
+
const run = await session.exec(`docker run -d --restart unless-stopped --network host --name ${name} ${parsed.image} tunnel --no-autoupdate run --token ${token}`);
|
|
58
|
+
if (run.code !== 0) {
|
|
59
|
+
throw new Error(`failed to start cloudflared on host: exited ${run.code}: ${run.stderr.trim()}`);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await session.dispose();
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
export const createTunnelProvider = (api = cloudflareApi, executor = sshExecutor) => ({
|
|
67
|
+
read: async (inputs, ctx) => {
|
|
68
|
+
const parsed = parse(inputs);
|
|
69
|
+
const tunnel = await api.findTunnel({ accountId: parsed.accountId, apiToken: parsed.apiToken, name: parsed.name });
|
|
70
|
+
if (tunnel === undefined) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
const ingress = await api.getTunnelIngress({ accountId: parsed.accountId, apiToken: parsed.apiToken, tunnelId: tunnel.id });
|
|
74
|
+
const connector = await checkConnector(executor, parsed, tunnel.id, ctx);
|
|
75
|
+
return {
|
|
76
|
+
outputs: { tunnelId: tunnel.id, cname: cname(tunnel.id) },
|
|
77
|
+
detail: { ingress: ingress ?? [], connectorRunning: connector.running, image: connector.image },
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
diff: (inputs, observed) => {
|
|
81
|
+
const parsed = parse(inputs);
|
|
82
|
+
const detail = observed.detail;
|
|
83
|
+
if (detail === undefined || detail["connectorRunning"] !== true) {
|
|
84
|
+
return { action: "update", reason: "cloudflared connector is not running on the host" };
|
|
85
|
+
}
|
|
86
|
+
if (detail["image"] !== parsed.image) {
|
|
87
|
+
return { action: "update", reason: `cloudflared image differs (running ${String(detail["image"])}, want ${parsed.image})` };
|
|
88
|
+
}
|
|
89
|
+
const current = detail["ingress"];
|
|
90
|
+
const actual = Array.isArray(current) ? current : [];
|
|
91
|
+
if (!ingressEqual(actual, desiredRules(parsed))) {
|
|
92
|
+
return { action: "update", reason: "tunnel ingress differs from desired" };
|
|
93
|
+
}
|
|
94
|
+
return { action: "noop" };
|
|
95
|
+
},
|
|
96
|
+
apply: async (inputs) => {
|
|
97
|
+
const parsed = parse(inputs);
|
|
98
|
+
const existing = await api.findTunnel({ accountId: parsed.accountId, apiToken: parsed.apiToken, name: parsed.name });
|
|
99
|
+
const tunnel = existing ?? (await api.createTunnel({ accountId: parsed.accountId, apiToken: parsed.apiToken, name: parsed.name }));
|
|
100
|
+
const token = await api.getTunnelToken({ accountId: parsed.accountId, apiToken: parsed.apiToken, tunnelId: tunnel.id });
|
|
101
|
+
await api.putTunnelIngress({
|
|
102
|
+
accountId: parsed.accountId,
|
|
103
|
+
apiToken: parsed.apiToken,
|
|
104
|
+
tunnelId: tunnel.id,
|
|
105
|
+
ingress: desiredRules(parsed),
|
|
106
|
+
});
|
|
107
|
+
await runConnector(executor, parsed, tunnel.id, token);
|
|
108
|
+
return { tunnelId: tunnel.id, cname: cname(tunnel.id) };
|
|
109
|
+
},
|
|
110
|
+
delete: async (inputs) => {
|
|
111
|
+
const parsed = parse(inputs);
|
|
112
|
+
const tunnel = await api.findTunnel({ accountId: parsed.accountId, apiToken: parsed.apiToken, name: parsed.name });
|
|
113
|
+
if (tunnel === undefined) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
117
|
+
try {
|
|
118
|
+
await session.exec(`docker rm -f ${containerName(tunnel.id)} 2>/dev/null || true`);
|
|
119
|
+
}
|
|
120
|
+
finally {
|
|
121
|
+
await session.dispose();
|
|
122
|
+
}
|
|
123
|
+
await api.deleteTunnel({ accountId: parsed.accountId, apiToken: parsed.apiToken, tunnelId: tunnel.id });
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
//# sourceMappingURL=tunnel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tunnel.js","sourceRoot":"","sources":["../src/tunnel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valkey-namespace.d.ts","sourceRoot":"","sources":["../src/valkey-namespace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAKjE,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,UAAU,CAAC;AAgCzD,eAAO,MAAM,6BAA6B,GAAI,WAAU,WAAyB,KAAG,QAmDlF,CAAC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { containerId } from "./backing-ssh.js";
|
|
3
|
+
import { parseInputs, sshSchema, sshTarget } from "./inputs.js";
|
|
4
|
+
import { sshExecutor } from "./ssh.js";
|
|
5
|
+
const namespaceSchema = sshSchema.extend({
|
|
6
|
+
instance: z.string(),
|
|
7
|
+
instanceHost: z.string(),
|
|
8
|
+
instancePort: z.string(),
|
|
9
|
+
adminPassword: z.string(),
|
|
10
|
+
username: z.string(),
|
|
11
|
+
password: z.string(),
|
|
12
|
+
keyPrefix: z.string(),
|
|
13
|
+
});
|
|
14
|
+
const parse = (inputs) => parseInputs(namespaceSchema, inputs, "valkey-namespace");
|
|
15
|
+
const url = (parsed) => `redis://${parsed.username}:${parsed.password}@${parsed.instanceHost}:${parsed.instancePort}/0`;
|
|
16
|
+
const cli = async (session, cid, parsed, args) => {
|
|
17
|
+
const result = await session.exec(`docker exec ${cid} valkey-cli -a '${parsed.adminPassword}' --no-auth-warning ${args}`);
|
|
18
|
+
if (result.code !== 0) {
|
|
19
|
+
throw new Error(`valkey-cli failed (${result.code}): ${result.stderr.trim()}`);
|
|
20
|
+
}
|
|
21
|
+
return result.stdout.trim();
|
|
22
|
+
};
|
|
23
|
+
export const createValkeyNamespaceProvider = (executor = sshExecutor) => ({
|
|
24
|
+
read: async (inputs, ctx) => {
|
|
25
|
+
const parsed = parse(inputs);
|
|
26
|
+
let session;
|
|
27
|
+
try {
|
|
28
|
+
session = await executor.connect(sshTarget(parsed));
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
ctx.log(`valkey-namespace "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
|
|
32
|
+
return undefined;
|
|
33
|
+
}
|
|
34
|
+
try {
|
|
35
|
+
const cid = await containerId(session, parsed.instance);
|
|
36
|
+
if (cid === "") {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
const user = await cli(session, cid, parsed, `ACL GETUSER ${parsed.username}`);
|
|
40
|
+
return user === "" ? undefined : { outputs: { url: url(parsed) } };
|
|
41
|
+
}
|
|
42
|
+
finally {
|
|
43
|
+
await session.dispose();
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
diff: () => ({ action: "noop" }),
|
|
47
|
+
apply: async (inputs, _observed, ctx) => {
|
|
48
|
+
const parsed = parse(inputs);
|
|
49
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
50
|
+
try {
|
|
51
|
+
const cid = await containerId(session, parsed.instance);
|
|
52
|
+
if (cid === "") {
|
|
53
|
+
throw new Error(`valkey-namespace "${ctx.id}": instance "${parsed.instance}" is not running`);
|
|
54
|
+
}
|
|
55
|
+
await cli(session, cid, parsed, `ACL SETUSER ${parsed.username} on '>${parsed.password}' '~${parsed.keyPrefix}:*' +@all`);
|
|
56
|
+
return { url: url(parsed) };
|
|
57
|
+
}
|
|
58
|
+
finally {
|
|
59
|
+
await session.dispose();
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
delete: async (inputs, ctx) => {
|
|
63
|
+
const parsed = parse(inputs);
|
|
64
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
65
|
+
try {
|
|
66
|
+
const cid = await containerId(session, parsed.instance);
|
|
67
|
+
if (cid === "") {
|
|
68
|
+
ctx.log(`valkey-namespace "${ctx.id}": instance "${parsed.instance}" already gone; nothing to drop`);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
await cli(session, cid, parsed, `ACL DELUSER ${parsed.username}`);
|
|
72
|
+
}
|
|
73
|
+
finally {
|
|
74
|
+
await session.dispose();
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
//# sourceMappingURL=valkey-namespace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valkey-namespace.js","sourceRoot":"","sources":["../src/valkey-namespace.ts"],"names":[],"mappings":"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"}
|
package/dist/valkey.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valkey.d.ts","sourceRoot":"","sources":["../src/valkey.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAKjE,OAAO,EAAE,KAAK,WAAW,EAAe,MAAM,UAAU,CAAC;AA2DzD,eAAO,MAAM,oBAAoB,GAAI,WAAU,WAAyB,KAAG,QAgDzE,CAAC"}
|
package/dist/valkey.js
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { composeDown, composeUp, containerImage, stateDir, waitReady } from "./backing-ssh.js";
|
|
3
|
+
import { parseInputs, sshSchema, sshTarget } from "./inputs.js";
|
|
4
|
+
import { sshExecutor } from "./ssh.js";
|
|
5
|
+
const KIND = "valkey";
|
|
6
|
+
const READY_TIMEOUT_MS = 60_000;
|
|
7
|
+
const valkeySchema = sshSchema.extend({
|
|
8
|
+
internalIp: z.string(),
|
|
9
|
+
publishPort: z.number(),
|
|
10
|
+
adminPassword: z.string(),
|
|
11
|
+
image: z.string(),
|
|
12
|
+
});
|
|
13
|
+
const parse = (inputs) => parseInputs(valkeySchema, inputs, KIND);
|
|
14
|
+
const outputsFor = (parsed) => ({
|
|
15
|
+
internalHost: parsed.internalIp,
|
|
16
|
+
port: String(parsed.publishPort),
|
|
17
|
+
});
|
|
18
|
+
const composeYaml = (id, parsed) => [
|
|
19
|
+
"services:",
|
|
20
|
+
" valkey:",
|
|
21
|
+
` image: ${parsed.image}`,
|
|
22
|
+
" restart: unless-stopped",
|
|
23
|
+
" command: [ valkey-server, /etc/valkey/valkey.conf ]",
|
|
24
|
+
" volumes:",
|
|
25
|
+
" - data:/data",
|
|
26
|
+
" - ./valkey.conf:/etc/valkey/valkey.conf:ro",
|
|
27
|
+
` ports: [ "${parsed.publishPort}:6379" ]`,
|
|
28
|
+
` labels: [ "intentic.id=${id}" ]`,
|
|
29
|
+
"volumes: { data: {} }",
|
|
30
|
+
"",
|
|
31
|
+
].join("\n");
|
|
32
|
+
const valkeyConf = (parsed) => [`requirepass ${parsed.adminPassword}`, "appendonly yes", ""].join("\n");
|
|
33
|
+
const ensureFiles = async (session, id, parsed) => {
|
|
34
|
+
const dir = stateDir(KIND, id);
|
|
35
|
+
await session.exec(`mkdir -p ${dir}`);
|
|
36
|
+
await session.exec(`cat > ${dir}/compose.yaml <<'COMPOSE_EOF'\n${composeYaml(id, parsed)}COMPOSE_EOF`);
|
|
37
|
+
await session.exec(`cat > ${dir}/valkey.conf <<'CONF_EOF'\n${valkeyConf(parsed)}CONF_EOF`);
|
|
38
|
+
await session.exec(`chmod 600 ${dir}/valkey.conf`);
|
|
39
|
+
};
|
|
40
|
+
const readyProbe = (id, parsed) => `cid=$(docker ps -q --filter "label=intentic.id=${id}"); [ -n "$cid" ] && docker exec "$cid" valkey-cli -a '${parsed.adminPassword}' ping | grep -q PONG`;
|
|
41
|
+
export const createValkeyProvider = (executor = sshExecutor) => ({
|
|
42
|
+
read: async (inputs, ctx) => {
|
|
43
|
+
const parsed = parse(inputs);
|
|
44
|
+
let session;
|
|
45
|
+
try {
|
|
46
|
+
session = await executor.connect(sshTarget(parsed));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
ctx.log(`valkey "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
try {
|
|
53
|
+
const probe = await session.exec(readyProbe(ctx.id, parsed));
|
|
54
|
+
if (probe.code !== 0) {
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
return { outputs: outputsFor(parsed), detail: { image: await containerImage(session, ctx.id) } };
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
await session.dispose();
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
diff: (inputs, observed) => {
|
|
64
|
+
const parsed = parse(inputs);
|
|
65
|
+
const image = (observed.detail?.["image"] ?? "");
|
|
66
|
+
return image === parsed.image
|
|
67
|
+
? { action: "noop" }
|
|
68
|
+
: { action: "update", reason: `valkey image differs (running ${image}, want ${parsed.image})` };
|
|
69
|
+
},
|
|
70
|
+
apply: async (inputs, _observed, ctx) => {
|
|
71
|
+
const parsed = parse(inputs);
|
|
72
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
73
|
+
try {
|
|
74
|
+
await ensureFiles(session, ctx.id, parsed);
|
|
75
|
+
await composeUp(session, KIND, ctx.id);
|
|
76
|
+
await waitReady(session, KIND, ctx.id, readyProbe(ctx.id, parsed), READY_TIMEOUT_MS);
|
|
77
|
+
return outputsFor(parsed);
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
await session.dispose();
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
delete: async (inputs, ctx) => {
|
|
84
|
+
const parsed = parse(inputs);
|
|
85
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
86
|
+
try {
|
|
87
|
+
await composeDown(session, KIND, ctx.id);
|
|
88
|
+
}
|
|
89
|
+
finally {
|
|
90
|
+
await session.dispose();
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
//# sourceMappingURL=valkey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"valkey.js","sourceRoot":"","sources":["../src/valkey.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAkB,MAAM,kBAAkB,CAAC;AAGjE,OAAO,KAAK,EAAE,WAAW,EAAc,MAAM,UAAU,CAAC;AA2CxD,eAAO,MAAM,6BAA6B,GAAI,WAAU,WAAyB,KAAG,QAwElF,CAAC"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { parseInputs, sshSchema, sshTarget } from "./inputs.js";
|
|
3
|
+
import { sshExecutor } from "./ssh.js";
|
|
4
|
+
const workspaceSchema = sshSchema.extend({
|
|
5
|
+
internalIp: z.string(),
|
|
6
|
+
domain: z.string(),
|
|
7
|
+
zone: z.string(),
|
|
8
|
+
previewPort: z.coerce.number(),
|
|
9
|
+
network: z.string(),
|
|
10
|
+
image: z.string(),
|
|
11
|
+
sandboxImage: z.string(),
|
|
12
|
+
platformUrl: z.string().optional(),
|
|
13
|
+
runnerToken: z.string().optional(),
|
|
14
|
+
agentBaseUrl: z.string().optional(),
|
|
15
|
+
});
|
|
16
|
+
const parse = (inputs) => parseInputs(workspaceSchema, inputs, "workspace");
|
|
17
|
+
const CONTAINER = "intentic-runner";
|
|
18
|
+
const internalUrl = (parsed) => `http://${parsed.internalIp}:${parsed.previewPort}`;
|
|
19
|
+
const outputsFor = (parsed) => ({
|
|
20
|
+
internalUrl: internalUrl(parsed),
|
|
21
|
+
healthUrl: `${internalUrl(parsed)}/healthz`,
|
|
22
|
+
previewBase: `preview.${parsed.zone}`,
|
|
23
|
+
});
|
|
24
|
+
const running = async (session) => {
|
|
25
|
+
const result = await session.exec(`docker ps --filter "name=^${CONTAINER}$" --format '{{.Names}}'`);
|
|
26
|
+
return result.stdout.trim() === CONTAINER;
|
|
27
|
+
};
|
|
28
|
+
const runningImage = async (session) => {
|
|
29
|
+
const result = await session.exec(`docker inspect --format '{{.Config.Image}}' ${CONTAINER} 2>/dev/null || true`);
|
|
30
|
+
return result.stdout.trim();
|
|
31
|
+
};
|
|
32
|
+
export const createWorkspaceRunnerProvider = (executor = sshExecutor) => ({
|
|
33
|
+
read: async (inputs, ctx) => {
|
|
34
|
+
const parsed = parse(inputs);
|
|
35
|
+
let session;
|
|
36
|
+
try {
|
|
37
|
+
session = await executor.connect(sshTarget(parsed));
|
|
38
|
+
}
|
|
39
|
+
catch (error) {
|
|
40
|
+
ctx.log(`workspace "${ctx.id}": host not reachable over SSH, treating as not-yet-created: ${String(error)}`);
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
try {
|
|
44
|
+
if (!(await running(session))) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
return { outputs: outputsFor(parsed), detail: { image: await runningImage(session) } };
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
await session.dispose();
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
diff: (inputs, observed) => {
|
|
54
|
+
const parsed = parse(inputs);
|
|
55
|
+
if (observed.detail?.["image"] !== parsed.image) {
|
|
56
|
+
return {
|
|
57
|
+
action: "update",
|
|
58
|
+
reason: `workspace runner image differs (running ${String(observed.detail?.["image"])}, want ${parsed.image})`,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return { action: "noop" };
|
|
62
|
+
},
|
|
63
|
+
apply: async (inputs, _observed, ctx) => {
|
|
64
|
+
const parsed = parse(inputs);
|
|
65
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
66
|
+
try {
|
|
67
|
+
await session.exec(`docker network inspect ${parsed.network} >/dev/null 2>&1 || docker network create ${parsed.network}`);
|
|
68
|
+
await session.exec(`docker rm -f ${CONTAINER} 2>/dev/null || true`);
|
|
69
|
+
const channelEnv = parsed.platformUrl !== undefined && parsed.runnerToken !== undefined
|
|
70
|
+
? ` -e PLATFORM_URL=${parsed.platformUrl} -e RUNNER_TOKEN=${parsed.runnerToken}`
|
|
71
|
+
: ``;
|
|
72
|
+
const agentEnv = parsed.agentBaseUrl !== undefined ? ` -e ANTHROPIC_BASE_URL=${parsed.agentBaseUrl}` : ``;
|
|
73
|
+
const run = await session.exec(`docker run -d --restart unless-stopped --user root --name ${CONTAINER} --label intentic.id=${ctx.id} ` +
|
|
74
|
+
`-p ${parsed.previewPort}:${parsed.previewPort} --network ${parsed.network} ` +
|
|
75
|
+
`-v /var/run/docker.sock:/var/run/docker.sock ` +
|
|
76
|
+
`-e ZONE=${parsed.zone} -e PREVIEW_PORT=${parsed.previewPort} -e SANDBOX_IMAGE=${parsed.sandboxImage}${channelEnv}${agentEnv} ${parsed.image}`);
|
|
77
|
+
if (run.code !== 0) {
|
|
78
|
+
throw new Error(`failed to start workspace runner on host: exited ${run.code}: ${run.stderr.trim()}`);
|
|
79
|
+
}
|
|
80
|
+
return outputsFor(parsed);
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
await session.dispose();
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
delete: async (inputs) => {
|
|
87
|
+
const parsed = parse(inputs);
|
|
88
|
+
const session = await executor.connect(sshTarget(parsed));
|
|
89
|
+
try {
|
|
90
|
+
await session.exec(`docker rm -f ${CONTAINER} 2>/dev/null || true`);
|
|
91
|
+
}
|
|
92
|
+
finally {
|
|
93
|
+
await session.dispose();
|
|
94
|
+
}
|
|
95
|
+
},
|
|
96
|
+
});
|
|
97
|
+
//# sourceMappingURL=workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.js","sourceRoot":"","sources":["../src/workspace.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,eAAe,GAAG,SAAS,CAAC,MAAM,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE;IAC9B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE;IAExB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAElC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACtC,CAAC,CAAC;AAEH,MAAM,KAAK,GAAG,CAAC,MAAsB,EAAmB,EAAE,CAAC,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AAE7G,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAEpC,MAAM,WAAW,GAAG,CAAC,MAAuB,EAAU,EAAE,CAAC,UAAU,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;AAC7G,MAAM,UAAU,GAAG,CAAC,MAAuB,EAA2B,EAAE,CAAC,CAAC;IACtE,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC;IAChC,SAAS,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC,UAAU;IAC3C,WAAW,EAAE,WAAW,MAAM,CAAC,IAAI,EAAE;CACxC,CAAC,CAAC;AAEH,MAAM,OAAO,GAAG,KAAK,EAAE,OAAmB,EAAoB,EAAE;IAC5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,6BAA6B,SAAS,0BAA0B,CAAC,CAAC;IACpG,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,SAAS,CAAC;AAC9C,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,KAAK,EAAE,OAAmB,EAAmB,EAAE;IAChE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,+CAA+C,SAAS,sBAAsB,CAAC,CAAC;IAClH,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC,CAAC;AAMF,MAAM,CAAC,MAAM,6BAA6B,GAAG,CAAC,WAAwB,WAAW,EAAY,EAAE,CAAC,CAAC;IAC7F,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE;QACxB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,OAAmB,CAAC;QACxB,IAAI,CAAC;YACD,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,GAAG,CAAC,GAAG,CAAC,cAAc,GAAG,CAAC,EAAE,gEAAgE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YAC7G,OAAO,SAAS,CAAC;QACrB,CAAC;QACD,IAAI,CAAC;YACD,IAAI,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC5B,OAAO,SAAS,CAAC;YACrB,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;QAC3F,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IAED,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,EAAE;QACvB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9C,OAAO;gBACH,MAAM,EAAE,QAAQ;gBAChB,MAAM,EAAE,2CAA2C,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,GAAG;aACjH,CAAC;QACN,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC9B,CAAC;IACD,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,EAAE;QACpC,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YAED,MAAM,OAAO,CAAC,IAAI,CAAC,0BAA0B,MAAM,CAAC,OAAO,6CAA6C,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1H,MAAM,OAAO,CAAC,IAAI,CAAC,gBAAgB,SAAS,sBAAsB,CAAC,CAAC;YAGpE,MAAM,UAAU,GACZ,MAAM,CAAC,WAAW,KAAK,SAAS,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;gBAChE,CAAC,CAAC,oBAAoB,MAAM,CAAC,WAAW,oBAAoB,MAAM,CAAC,WAAW,EAAE;gBAChF,CAAC,CAAC,EAAE,CAAC;YAEb,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,0BAA0B,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC1G,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,CAK1B,6DAA6D,SAAS,wBAAwB,GAAG,CAAC,EAAE,GAAG;gBACnG,MAAM,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,cAAc,MAAM,CAAC,OAAO,GAAG;gBAC7E,+CAA+C;gBAC/C,WAAW,MAAM,CAAC,IAAI,oBAAoB,MAAM,CAAC,WAAW,qBAAqB,MAAM,CAAC,YAAY,GAAG,UAAU,GAAG,QAAQ,IAAI,MAAM,CAAC,KAAK,EAAE,CACrJ,CAAC;YACF,IAAI,GAAG,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CAAC,oDAAoD,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1G,CAAC;YACD,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;IACD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;QACrB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QAC1D,IAAI,CAAC;YACD,MAAM,OAAO,CAAC,IAAI,CAAC,gBAAgB,SAAS,sBAAsB,CAAC,CAAC;QACxE,CAAC;gBAAS,CAAC;YACP,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,CAAC;IACL,CAAC;CACJ,CAAC,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@intentic/providers",
|
|
3
|
+
"version": "1.18.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/radarsu/intentic.git",
|
|
10
|
+
"directory": "_libs/providers"
|
|
11
|
+
},
|
|
12
|
+
"files": [
|
|
13
|
+
"dist"
|
|
14
|
+
],
|
|
15
|
+
"publishConfig": {
|
|
16
|
+
"access": "public",
|
|
17
|
+
"registry": "https://registry.npmjs.org/"
|
|
18
|
+
},
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": {
|
|
23
|
+
"@intentic/src": "./src/index.ts",
|
|
24
|
+
"default": "./dist/index.js"
|
|
25
|
+
},
|
|
26
|
+
"require": {
|
|
27
|
+
"@intentic/src": "./src/index.ts",
|
|
28
|
+
"default": "./dist/index.js"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"ssh2": "1.17.0",
|
|
34
|
+
"tslib": "2.8.1",
|
|
35
|
+
"zod": "4.4.3",
|
|
36
|
+
"@intentic/engine": "1.18.0",
|
|
37
|
+
"@intentic/graph": "1.18.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@types/node": "24.13.2",
|
|
41
|
+
"@types/ssh2": "1.15.5",
|
|
42
|
+
"typescript": "5.9.3",
|
|
43
|
+
"vitest": "4.1.9",
|
|
44
|
+
"@intentic/sdk": "1.18.0",
|
|
45
|
+
"@intentic/tsconfig": "0.0.0"
|
|
46
|
+
},
|
|
47
|
+
"scripts": {
|
|
48
|
+
"build": "tsc",
|
|
49
|
+
"watch": "tsc --build --watch",
|
|
50
|
+
"test": "vitest run",
|
|
51
|
+
"test:watch": "vitest"
|
|
52
|
+
}
|
|
53
|
+
}
|