@a5c-ai/cloud 5.0.1-staging.7a8768ec

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 (68) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +40 -0
  3. package/SPEC.md +449 -0
  4. package/dist/adapters/agent-mux-gateway.d.ts +3 -0
  5. package/dist/adapters/agent-mux-gateway.d.ts.map +1 -0
  6. package/dist/adapters/agent-mux-gateway.js +164 -0
  7. package/dist/adapters/agent-mux-gateway.js.map +1 -0
  8. package/dist/adapters/babysitter-agent.d.ts +3 -0
  9. package/dist/adapters/babysitter-agent.d.ts.map +1 -0
  10. package/dist/adapters/babysitter-agent.js +94 -0
  11. package/dist/adapters/babysitter-agent.js.map +1 -0
  12. package/dist/adapters/kanban.d.ts +3 -0
  13. package/dist/adapters/kanban.d.ts.map +1 -0
  14. package/dist/adapters/kanban.js +99 -0
  15. package/dist/adapters/kanban.js.map +1 -0
  16. package/dist/cli.d.ts +8 -0
  17. package/dist/cli.d.ts.map +1 -0
  18. package/dist/cli.js +341 -0
  19. package/dist/cli.js.map +1 -0
  20. package/dist/index.d.ts +11 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +11 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/kubernetes/render.d.ts +3 -0
  25. package/dist/kubernetes/render.d.ts.map +1 -0
  26. package/dist/kubernetes/render.js +64 -0
  27. package/dist/kubernetes/render.js.map +1 -0
  28. package/dist/sdk/agents.d.ts +7 -0
  29. package/dist/sdk/agents.d.ts.map +1 -0
  30. package/dist/sdk/agents.js +153 -0
  31. package/dist/sdk/agents.js.map +1 -0
  32. package/dist/sdk/auth.d.ts +2 -0
  33. package/dist/sdk/auth.d.ts.map +1 -0
  34. package/dist/sdk/auth.js +47 -0
  35. package/dist/sdk/auth.js.map +1 -0
  36. package/dist/sdk/config.d.ts +5 -0
  37. package/dist/sdk/config.d.ts.map +1 -0
  38. package/dist/sdk/config.js +239 -0
  39. package/dist/sdk/config.js.map +1 -0
  40. package/dist/sdk/deploy.d.ts +3 -0
  41. package/dist/sdk/deploy.d.ts.map +1 -0
  42. package/dist/sdk/deploy.js +170 -0
  43. package/dist/sdk/deploy.js.map +1 -0
  44. package/dist/sdk/environments.d.ts +3 -0
  45. package/dist/sdk/environments.d.ts.map +1 -0
  46. package/dist/sdk/environments.js +126 -0
  47. package/dist/sdk/environments.js.map +1 -0
  48. package/dist/sdk/plans.d.ts +2 -0
  49. package/dist/sdk/plans.d.ts.map +1 -0
  50. package/dist/sdk/plans.js +145 -0
  51. package/dist/sdk/plans.js.map +1 -0
  52. package/dist/sdk/providers.d.ts +6 -0
  53. package/dist/sdk/providers.d.ts.map +1 -0
  54. package/dist/sdk/providers.js +183 -0
  55. package/dist/sdk/providers.js.map +1 -0
  56. package/dist/sdk/upgrade.d.ts +2 -0
  57. package/dist/sdk/upgrade.d.ts.map +1 -0
  58. package/dist/sdk/upgrade.js +5 -0
  59. package/dist/sdk/upgrade.js.map +1 -0
  60. package/dist/terraform/root.d.ts +2 -0
  61. package/dist/terraform/root.d.ts.map +1 -0
  62. package/dist/terraform/root.js +168 -0
  63. package/dist/terraform/root.js.map +1 -0
  64. package/dist/types.d.ts +341 -0
  65. package/dist/types.d.ts.map +1 -0
  66. package/dist/types.js +2 -0
  67. package/dist/types.js.map +1 -0
  68. package/package.json +76 -0
@@ -0,0 +1,183 @@
1
+ import * as fs from "fs";
2
+ import * as os from "os";
3
+ import * as path from "path";
4
+ const PROVIDER_DEFAULTS = {
5
+ anthropic: { transport: "anthropic", authType: "api_key" },
6
+ openai: { transport: "openai-responses", authType: "api_key" },
7
+ google: { transport: "google", authType: "api_key" },
8
+ bedrock: { transport: "anthropic", authType: "iam" },
9
+ vertex: { transport: "google", authType: "adc" },
10
+ azure: { transport: "openai-chat", authType: "api_key" },
11
+ foundry: { transport: "openai-chat", authType: "api_key" },
12
+ ollama: { transport: "openai-chat", authType: "none" },
13
+ local: { transport: "openai-chat", authType: "none" },
14
+ openrouter: { transport: "openai-chat", authType: "api_key" },
15
+ groq: { transport: "openai-chat", authType: "api_key" },
16
+ fireworks: { transport: "openai-chat", authType: "api_key" },
17
+ together: { transport: "openai-chat", authType: "api_key" },
18
+ deepseek: { transport: "openai-chat", authType: "api_key" },
19
+ mistral: { transport: "openai-chat", authType: "api_key" },
20
+ cerebras: { transport: "openai-chat", authType: "api_key" },
21
+ sambanova: { transport: "openai-chat", authType: "api_key" },
22
+ custom: { transport: "openai-chat", authType: "api_key" },
23
+ lmstudio: { transport: "openai-chat", authType: "none" },
24
+ vllm: { transport: "openai-chat", authType: "none" },
25
+ "nvidia-nim": { transport: "openai-chat", authType: "api_key" },
26
+ perplexity: { transport: "openai-chat", authType: "api_key" },
27
+ cohere: { transport: "openai-chat", authType: "api_key" },
28
+ };
29
+ function providerSecretName(namespace, providerId) {
30
+ return `${namespace}-${providerId}-provider`.replace(/[^a-z0-9-]/gi, "-").toLowerCase();
31
+ }
32
+ function providerKey(providerId) {
33
+ return providerId.toUpperCase().replace(/[^A-Z0-9]/g, "_");
34
+ }
35
+ function toProviderCredentialBindings(provider) {
36
+ return (provider.credentials ?? []).map((credential) => ({
37
+ providerId: provider.id,
38
+ envVar: credential.envVar,
39
+ ...(credential.value ? { value: credential.value } : {}),
40
+ ...(credential.secretRef ? { secretRef: credential.secretRef } : {}),
41
+ required: credential.required !== false,
42
+ }));
43
+ }
44
+ function resolveProviderDefaults(providerId) {
45
+ if (providerId in PROVIDER_DEFAULTS) {
46
+ return PROVIDER_DEFAULTS[providerId];
47
+ }
48
+ return PROVIDER_DEFAULTS.custom;
49
+ }
50
+ function buildProviderProfile(provider) {
51
+ const defaults = resolveProviderDefaults(provider.id);
52
+ const model = provider.defaultModel ?? provider.models?.[0];
53
+ const params = {};
54
+ if (!(provider.id in PROVIDER_DEFAULTS)) {
55
+ params.litellmProvider = provider.id;
56
+ }
57
+ return {
58
+ provider: provider.id,
59
+ ...(model ? { model } : {}),
60
+ transport: defaults.transport,
61
+ auth: { type: defaults.authType },
62
+ ...(Object.keys(params).length > 0 ? { params } : {}),
63
+ };
64
+ }
65
+ function defaultRouting(config, providers) {
66
+ const modelRouting = config.components.babysitterAgent?.modelRouting ?? [];
67
+ return modelRouting.find((route) => !route.agent)
68
+ ?? providers
69
+ .map((provider) => provider.defaultModel ? { provider: provider.id, model: provider.defaultModel } : undefined)
70
+ .find((entry) => entry !== undefined);
71
+ }
72
+ function buildProviderAutomationPlan(config) {
73
+ const providers = config.components.babysitterAgent?.providers ?? [];
74
+ const modelRouting = config.components.babysitterAgent?.modelRouting ?? [];
75
+ const defaultRoute = defaultRouting(config, providers);
76
+ return {
77
+ scope: "project",
78
+ filePath: ".amux/providers.json",
79
+ providersFile: {
80
+ version: 1,
81
+ ...(defaultRoute ? { defaults: { provider: defaultRoute.provider, model: defaultRoute.model } } : {}),
82
+ profiles: Object.fromEntries(providers.map((provider) => [provider.id, buildProviderProfile(provider)])),
83
+ },
84
+ modelRouting,
85
+ credentials: providers.flatMap((provider) => toProviderCredentialBindings(provider)),
86
+ };
87
+ }
88
+ function resolveProvidersFilePath(scope, cwd) {
89
+ if (scope === "global") {
90
+ return path.join(os.homedir(), ".amux", "providers.json");
91
+ }
92
+ return path.join(cwd ?? process.cwd(), ".amux", "providers.json");
93
+ }
94
+ function writeProvidersFile(filePath, providersFile) {
95
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
96
+ fs.writeFileSync(filePath, `${JSON.stringify(providersFile, null, 2)}\n`, {
97
+ encoding: "utf8",
98
+ mode: 0o600,
99
+ });
100
+ try {
101
+ fs.chmodSync(filePath, 0o600);
102
+ }
103
+ catch { }
104
+ }
105
+ function providerSecretManifest(namespace, secretName, provider) {
106
+ const stringData = {};
107
+ for (const credential of provider.credentials ?? []) {
108
+ if (credential.value) {
109
+ stringData[credential.envVar] = credential.value;
110
+ }
111
+ }
112
+ if (Object.keys(stringData).length === 0) {
113
+ return null;
114
+ }
115
+ return {
116
+ apiVersion: "v1",
117
+ kind: "Secret",
118
+ metadata: {
119
+ name: secretName,
120
+ namespace,
121
+ labels: {
122
+ "app.kubernetes.io/name": provider.id,
123
+ "app.kubernetes.io/component": "provider-config",
124
+ },
125
+ },
126
+ type: "Opaque",
127
+ stringData,
128
+ };
129
+ }
130
+ export function configureProviders(config) {
131
+ const providers = config.components.babysitterAgent?.providers ?? [];
132
+ const manifests = [];
133
+ const env = {};
134
+ const summary = [];
135
+ const automation = buildProviderAutomationPlan(config);
136
+ for (const provider of providers) {
137
+ const key = providerKey(provider.id);
138
+ const secretName = providerSecretName(config.namespace, provider.id);
139
+ const manifest = providerSecretManifest(config.namespace, secretName, provider);
140
+ if (manifest) {
141
+ manifests.push(manifest);
142
+ env[`PROVIDER_${key}_SECRET`] = secretName;
143
+ }
144
+ if (provider.defaultModel) {
145
+ env[`PROVIDER_${key}_DEFAULT_MODEL`] = provider.defaultModel;
146
+ }
147
+ summary.push(`provider ${provider.id}: ${manifest ? "secret rendered" : "secret ref only"}`);
148
+ }
149
+ env.BABYSITTER_AGENT_PROVIDER_CONFIG_JSON = JSON.stringify(config.components.babysitterAgent?.providers ?? []);
150
+ env.BABYSITTER_AGENT_MODEL_ROUTING_JSON = JSON.stringify(automation.modelRouting);
151
+ env.BABYSITTER_AGENT_AMUX_PROVIDERS_FILE_PATH = automation.filePath;
152
+ env.BABYSITTER_AGENT_AMUX_PROVIDERS_FILE_JSON = JSON.stringify(automation.providersFile);
153
+ env.BABYSITTER_AGENT_AMUX_MODEL_ROUTING_JSON = JSON.stringify(automation.modelRouting);
154
+ summary.push(`agent-mux provider config: ${automation.filePath}`);
155
+ return {
156
+ manifests,
157
+ env,
158
+ summary,
159
+ automation,
160
+ };
161
+ }
162
+ export function applyProviderConfiguration(config, options = {}) {
163
+ const planned = configureProviders(config);
164
+ const scope = options.scope ?? config.execution?.providerConfigScope ?? "project";
165
+ const filePath = resolveProvidersFilePath(scope, options.cwd);
166
+ writeProvidersFile(filePath, planned.automation.providersFile);
167
+ return {
168
+ success: true,
169
+ scope,
170
+ filePath,
171
+ providersFile: planned.automation.providersFile,
172
+ modelRouting: planned.automation.modelRouting,
173
+ credentials: planned.automation.credentials,
174
+ summary: [
175
+ `wrote ${scope} provider profile file`,
176
+ `configured ${planned.automation.credentials.length} provider credential binding(s)`,
177
+ ...(planned.automation.modelRouting.length > 0
178
+ ? [`configured ${planned.automation.modelRouting.length} model routing rule(s)`]
179
+ : []),
180
+ ],
181
+ };
182
+ }
183
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/sdk/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { CloudConfig, InstallOptions, InstallResult } from "../types.js";
2
+ export declare function upgradeEnvironment(config: CloudConfig, options?: InstallOptions): Promise<InstallResult>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.d.ts","sourceRoot":"","sources":["../../src/sdk/upgrade.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG9E,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAElH"}
@@ -0,0 +1,5 @@
1
+ import { installEnvironment } from "./deploy.js";
2
+ export async function upgradeEnvironment(config, options = {}) {
3
+ return await installEnvironment(config, options);
4
+ }
5
+ //# sourceMappingURL=upgrade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upgrade.js","sourceRoot":"","sources":["../../src/sdk/upgrade.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAmB,EAAE,UAA0B,EAAE;IACxF,OAAO,MAAM,kBAAkB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { DeploymentPlan, TerraformRenderResult } from "../types.js";
2
+ export declare function renderTerraform(plan: DeploymentPlan): TerraformRenderResult;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../../src/terraform/root.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAe,cAAc,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA8ItF,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,qBAAqB,CAmC3E"}
@@ -0,0 +1,168 @@
1
+ function quote(value) {
2
+ return JSON.stringify(value);
3
+ }
4
+ function sharedTerraformBlocks(config) {
5
+ return [
6
+ "terraform {",
7
+ " required_version = \">= 1.6.0\"",
8
+ "}",
9
+ "",
10
+ "variable \"namespace\" { type = string }",
11
+ "variable \"release_tag\" { type = string }",
12
+ "locals {",
13
+ ` namespace = var.namespace`,
14
+ ` release_tag = var.release_tag`,
15
+ ` ingress_tls = ${config.ingress.tls ? "true" : "false"}`,
16
+ "}",
17
+ ].join("\n");
18
+ }
19
+ function renderMinikube(config) {
20
+ return [
21
+ sharedTerraformBlocks(config),
22
+ "",
23
+ "resource \"null_resource\" \"minikube_cluster\" {",
24
+ " triggers = {",
25
+ ` profile = ${quote(config.target.type === "minikube" ? (config.target.profile ?? "babysitter") : "babysitter")}`,
26
+ " }",
27
+ " provisioner \"local-exec\" {",
28
+ ` command = "minikube start -p ${config.target.type === "minikube" ? (config.target.profile ?? "babysitter") : "babysitter"}"`,
29
+ " }",
30
+ "}",
31
+ "",
32
+ "output \"cluster_name\" {",
33
+ ` value = ${quote(config.target.type === "minikube" ? (config.target.profile ?? "babysitter") : "babysitter")}`,
34
+ "}",
35
+ ].join("\n");
36
+ }
37
+ function renderExistingCluster(config) {
38
+ const context = config.target.type === "existing" ? config.target.kubeContext : "default";
39
+ return [
40
+ sharedTerraformBlocks(config),
41
+ "",
42
+ "locals {",
43
+ ` kube_context = ${quote(context)}`,
44
+ "}",
45
+ "",
46
+ "output \"kube_context\" {",
47
+ " value = local.kube_context",
48
+ "}",
49
+ ].join("\n");
50
+ }
51
+ function renderEks(config) {
52
+ if (config.target.type !== "eks") {
53
+ return renderExistingCluster(config);
54
+ }
55
+ return [
56
+ sharedTerraformBlocks(config),
57
+ "",
58
+ "provider \"aws\" {",
59
+ ` region = ${quote(config.target.region)}`,
60
+ "}",
61
+ "",
62
+ "module \"eks\" {",
63
+ " source = \"terraform-aws-modules/eks/aws\"",
64
+ " version = \"~> 20.0\"",
65
+ ` cluster_name = ${quote(config.target.clusterName)}`,
66
+ ` cluster_version = "1.30"`,
67
+ " subnet_ids = []",
68
+ " vpc_id = \"replace-me\"",
69
+ "}",
70
+ "",
71
+ "output \"cluster_name\" {",
72
+ " value = module.eks.cluster_name",
73
+ "}",
74
+ ].join("\n");
75
+ }
76
+ function renderAks(config) {
77
+ if (config.target.type !== "aks") {
78
+ return renderExistingCluster(config);
79
+ }
80
+ return [
81
+ sharedTerraformBlocks(config),
82
+ "",
83
+ "provider \"azurerm\" {",
84
+ " features {}",
85
+ ` subscription_id = ${quote(config.target.subscriptionId)}`,
86
+ "}",
87
+ "",
88
+ "resource \"azurerm_resource_group\" \"this\" {",
89
+ ` name = ${quote(config.target.resourceGroup)}`,
90
+ ` location = "eastus"`,
91
+ "}",
92
+ "",
93
+ "resource \"azurerm_kubernetes_cluster\" \"this\" {",
94
+ ` name = ${quote(config.target.clusterName)}`,
95
+ " location = azurerm_resource_group.this.location",
96
+ " resource_group_name = azurerm_resource_group.this.name",
97
+ " dns_prefix = \"babysitter\"",
98
+ " default_node_pool {",
99
+ " name = \"default\"",
100
+ " node_count = 2",
101
+ " vm_size = \"Standard_D4s_v5\"",
102
+ " }",
103
+ " identity { type = \"SystemAssigned\" }",
104
+ "}",
105
+ ].join("\n");
106
+ }
107
+ function renderGke(config) {
108
+ if (config.target.type !== "gke") {
109
+ return renderExistingCluster(config);
110
+ }
111
+ return [
112
+ sharedTerraformBlocks(config),
113
+ "",
114
+ "provider \"google\" {",
115
+ ` project = ${quote(config.target.projectId)}`,
116
+ ` region = ${quote(config.target.region)}`,
117
+ "}",
118
+ "",
119
+ "resource \"google_container_cluster\" \"this\" {",
120
+ ` name = ${quote(config.target.clusterName)}`,
121
+ ` location = ${quote(config.target.region)}`,
122
+ " deletion_protection = false",
123
+ " initial_node_count = 1",
124
+ "}",
125
+ ].join("\n");
126
+ }
127
+ function tfvars(config, releaseTag) {
128
+ return JSON.stringify({
129
+ namespace: config.namespace,
130
+ release_tag: releaseTag,
131
+ }, null, 2);
132
+ }
133
+ export function renderTerraform(plan) {
134
+ const config = plan.config;
135
+ const main = (() => {
136
+ switch (config.target.type) {
137
+ case "minikube":
138
+ return renderMinikube(config);
139
+ case "existing":
140
+ return renderExistingCluster(config);
141
+ case "eks":
142
+ return renderEks(config);
143
+ case "aks":
144
+ return renderAks(config);
145
+ case "gke":
146
+ return renderGke(config);
147
+ }
148
+ })();
149
+ return {
150
+ directoryName: "terraform",
151
+ files: [
152
+ { path: "main.tf", content: main },
153
+ { path: "terraform.tfvars.json", content: tfvars(config, plan.releaseTag) },
154
+ {
155
+ path: "README.auto.md",
156
+ content: [
157
+ "# Generated by @a5c-ai/cloud",
158
+ "",
159
+ `Target: ${config.target.type}`,
160
+ `Namespace: ${config.namespace}`,
161
+ `Release tag: ${plan.releaseTag}`,
162
+ ].join("\n"),
163
+ },
164
+ ],
165
+ summary: plan.terraform.summary,
166
+ };
167
+ }
168
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../../src/terraform/root.ts"],"names":[],"mappings":"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"}