@assemblyline-agents/cli 5.0.10 → 6.0.1

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 (93) hide show
  1. package/authoring/skills/assembly-line-authoring/SKILL.md +24 -21
  2. package/dist/add.d.ts +2 -13
  3. package/dist/add.d.ts.map +1 -1
  4. package/dist/add.js +169 -478
  5. package/dist/add.js.map +1 -1
  6. package/dist/args.d.ts.map +1 -1
  7. package/dist/args.js +1 -2
  8. package/dist/args.js.map +1 -1
  9. package/dist/auth.d.ts +1 -2
  10. package/dist/auth.d.ts.map +1 -1
  11. package/dist/auth.js +38 -45
  12. package/dist/auth.js.map +1 -1
  13. package/dist/channels.d.ts +7 -30
  14. package/dist/channels.d.ts.map +1 -1
  15. package/dist/channels.js +21 -161
  16. package/dist/channels.js.map +1 -1
  17. package/dist/deploy-definition.d.ts +1 -8
  18. package/dist/deploy-definition.d.ts.map +1 -1
  19. package/dist/deploy-definition.js +18 -66
  20. package/dist/deploy-definition.js.map +1 -1
  21. package/dist/deploy-migrations.d.ts +15 -0
  22. package/dist/deploy-migrations.d.ts.map +1 -0
  23. package/dist/deploy-migrations.js +72 -0
  24. package/dist/deploy-migrations.js.map +1 -0
  25. package/dist/deploy-preflight.d.ts +6 -0
  26. package/dist/deploy-preflight.d.ts.map +1 -0
  27. package/dist/deploy-preflight.js +40 -0
  28. package/dist/deploy-preflight.js.map +1 -0
  29. package/dist/deploy-receipts.d.ts +9 -0
  30. package/dist/deploy-receipts.d.ts.map +1 -0
  31. package/dist/deploy-receipts.js +45 -0
  32. package/dist/deploy-receipts.js.map +1 -0
  33. package/dist/deploy-sandbox-environments.d.ts +6 -0
  34. package/dist/deploy-sandbox-environments.d.ts.map +1 -0
  35. package/dist/deploy-sandbox-environments.js +109 -0
  36. package/dist/deploy-sandbox-environments.js.map +1 -0
  37. package/dist/deploy-secrets.d.ts +21 -0
  38. package/dist/deploy-secrets.d.ts.map +1 -0
  39. package/dist/deploy-secrets.js +83 -0
  40. package/dist/deploy-secrets.js.map +1 -0
  41. package/dist/deploy.d.ts +5 -31
  42. package/dist/deploy.d.ts.map +1 -1
  43. package/dist/deploy.js +50 -636
  44. package/dist/deploy.js.map +1 -1
  45. package/dist/eval-case-runner.d.ts +1 -1
  46. package/dist/eval-case-runner.d.ts.map +1 -1
  47. package/dist/eval-case-runner.js.map +1 -1
  48. package/dist/help.d.ts.map +1 -1
  49. package/dist/help.js +41 -89
  50. package/dist/help.js.map +1 -1
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +89 -32
  53. package/dist/index.js.map +1 -1
  54. package/dist/init.d.ts +1 -3
  55. package/dist/init.d.ts.map +1 -1
  56. package/dist/init.js +36 -39
  57. package/dist/init.js.map +1 -1
  58. package/dist/inspection.d.ts +44 -0
  59. package/dist/inspection.d.ts.map +1 -0
  60. package/dist/inspection.js +144 -0
  61. package/dist/inspection.js.map +1 -0
  62. package/dist/models.d.ts +2 -1
  63. package/dist/models.d.ts.map +1 -1
  64. package/dist/models.js +7 -13
  65. package/dist/models.js.map +1 -1
  66. package/dist/plugin-add.d.ts +36 -0
  67. package/dist/plugin-add.d.ts.map +1 -0
  68. package/dist/plugin-add.js +283 -0
  69. package/dist/plugin-add.js.map +1 -0
  70. package/dist/plugin-init.d.ts +2 -0
  71. package/dist/plugin-init.d.ts.map +1 -0
  72. package/dist/plugin-init.js +34 -0
  73. package/dist/plugin-init.js.map +1 -0
  74. package/dist/provider-deploy.d.ts +7 -0
  75. package/dist/provider-deploy.d.ts.map +1 -0
  76. package/dist/provider-deploy.js +163 -0
  77. package/dist/provider-deploy.js.map +1 -0
  78. package/dist/secrets.d.ts.map +1 -1
  79. package/dist/secrets.js +8 -28
  80. package/dist/secrets.js.map +1 -1
  81. package/package.json +9 -11
  82. package/dist/hosts.d.ts +0 -3
  83. package/dist/hosts.d.ts.map +0 -1
  84. package/dist/hosts.js +0 -60
  85. package/dist/hosts.js.map +0 -1
  86. package/dist/model-providers.d.ts +0 -5
  87. package/dist/model-providers.d.ts.map +0 -1
  88. package/dist/model-providers.js +0 -17
  89. package/dist/model-providers.js.map +0 -1
  90. package/dist/state.d.ts +0 -3
  91. package/dist/state.d.ts.map +0 -1
  92. package/dist/state.js +0 -79
  93. package/dist/state.js.map +0 -1
@@ -1,14 +1,7 @@
1
1
  import type { AdapterDefinition, AgentManifest } from "@assemblyline-agents/core";
2
2
  import { type ParsedArgs } from "./args.js";
3
- /**
4
- * Resolve deploy configuration once so publish and hosted auth use identical
5
- * precedence. Environment scoping happens here because only this layer knows
6
- * whether an identity option (such as a Fly app) was configured in the
7
- * manifest — which non-default environments must scope — or passed explicitly
8
- * on the command line, which is always respected verbatim.
9
- */
3
+ /** Resolve the selected deploy plugin without embedding provider option names in the CLI. */
10
4
  export declare function resolveDeployDefinition(manifest: AgentManifest, target: string, parsed: ParsedArgs, env?: Record<string, string | undefined>, cwd?: string): AdapterDefinition;
11
5
  export declare function resolveDeployEnvironment(manifest: AgentManifest, parsed: ParsedArgs, env?: Record<string, string | undefined>): string;
12
- /** The environment deploys land in when --env/ASSEMBLY_LINE_DEPLOY_ENV are absent. */
13
6
  export declare function resolveDefaultDeployEnvironment(manifest: AgentManifest): string;
14
7
  //# sourceMappingURL=deploy-definition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy-definition.d.ts","sourceRoot":"","sources":["../src/deploy-definition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAc,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAuC,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAEjF;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,GAAG,SAAgB,GAClB,iBAAiB,CAkDnB;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,UAAU,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,CAMR;AAED,sFAAsF;AACtF,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAG/E"}
1
+ {"version":3,"file":"deploy-definition.d.ts","sourceRoot":"","sources":["../src/deploy-definition.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAc,MAAM,2BAA2B,CAAC;AAC9F,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,6FAA6F;AAC7F,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,UAAU,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,GAAG,SAAgB,GAClB,iBAAiB,CAqBnB;AAED,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,UAAU,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GACpD,MAAM,CAMR;AAED,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAG/E"}
@@ -1,56 +1,27 @@
1
1
  import { environmentScopedName } from "@assemblyline-agents/core";
2
- import { booleanFlag, numberFlag, stringFlag } from "./args.js";
3
- /**
4
- * Resolve deploy configuration once so publish and hosted auth use identical
5
- * precedence. Environment scoping happens here because only this layer knows
6
- * whether an identity option (such as a Fly app) was configured in the
7
- * manifest — which non-default environments must scope — or passed explicitly
8
- * on the command line, which is always respected verbatim.
9
- */
2
+ import { stringFlag } from "./args.js";
3
+ /** Resolve the selected deploy plugin without embedding provider option names in the CLI. */
10
4
  export function resolveDeployDefinition(manifest, target, parsed, env = process.env, cwd = process.cwd()) {
11
- const configured = manifest.gateway.deploy?.kind === target ? manifest.gateway.deploy : undefined;
12
- const options = { ...(configured?.options ?? {}) };
13
- const environment = resolveDeployEnvironment(manifest, parsed, env);
14
- const defaultEnvironment = resolveDefaultDeployEnvironment(manifest);
15
- const scope = { environment, defaultEnvironment };
16
- if (target === "railway") {
17
- setString(options, "railwayBin", stringFlag(parsed, "railway-bin"));
18
- setString(options, "project", stringFlag(parsed, "railway-project") ?? env.RAILWAY_PROJECT_ID ?? jsonString(options.project));
19
- setString(options, "service", stringFlag(parsed, "railway-service") ?? env.RAILWAY_SERVICE_ID ?? jsonString(options.service));
20
- setBoolean(options, "json", flagBoolean(parsed, "railway-json"));
21
- setBoolean(options, "detach", flagBoolean(parsed, "detach"));
5
+ const configured = manifest.gateway.deploy;
6
+ if (!configured || configured.kind !== target) {
7
+ throw new Error(`Deploy target ${target} is not selected by agent.md.`);
22
8
  }
23
- else if (target === "docker") {
24
- setString(options, "dockerBin", stringFlag(parsed, "docker-bin"));
25
- setString(options, "image", stringFlag(parsed, "docker-image") ?? env.ASSEMBLY_LINE_DOCKER_IMAGE ?? jsonString(options.image));
26
- const serve = flagBoolean(parsed, "serve") ?? flagBoolean(parsed, "run");
27
- setBoolean(options, "serve", serve);
28
- setNumber(options, "port", numberFlag(parsed, "port"));
29
- }
30
- else if (target === "fly") {
31
- setString(options, "flyBin", stringFlag(parsed, "fly-bin"));
32
- const explicitApp = stringFlag(parsed, "fly-app") ?? env.FLY_APP_NAME;
33
- const manifestApp = jsonString(options.app);
34
- setString(options, "app", explicitApp ?? (manifestApp ? environmentScopedName(manifestApp, scope) : undefined));
35
- setString(options, "org", stringFlag(parsed, "fly-org") ?? env.FLY_ORG ?? jsonString(options.org));
36
- setString(options, "region", stringFlag(parsed, "fly-region") ?? env.FLY_REGION ?? jsonString(options.region));
37
- setString(options, "memory", stringFlag(parsed, "fly-memory"));
38
- setString(options, "vmSize", stringFlag(parsed, "fly-vm-size"));
39
- setNumber(options, "internalPort", numberFlag(parsed, "fly-internal-port"));
40
- setBoolean(options, "detach", flagBoolean(parsed, "detach"));
41
- }
42
- else if (target === "vps") {
43
- if (parsed.flags["vps-domain"] !== undefined) {
44
- throw new Error("--vps-domain was removed. Configure the host ingress baseDomain in assembly-line.hosts.json.");
45
- }
46
- setString(options, "host", stringFlag(parsed, "vps-host") ?? jsonString(options.host));
47
- setString(options, "hostsFile", stringFlag(parsed, "vps-hosts-file") ?? env.ASSEMBLY_LINE_VPS_HOSTS_FILE ?? jsonString(options.hostsFile));
9
+ const metadata = manifest.providerMetadata?.find((entry) => entry.role === "deploy" && entry.kind === target);
10
+ const options = { ...(configured.options ?? {}), cwd };
11
+ const scope = {
12
+ environment: resolveDeployEnvironment(manifest, parsed, env),
13
+ defaultEnvironment: resolveDefaultDeployEnvironment(manifest)
14
+ };
15
+ for (const name of metadata?.deployment?.environmentScopedOptions ?? []) {
16
+ const value = options[name];
17
+ if (typeof value === "string" && value.trim())
18
+ options[name] = environmentScopedName(value, scope);
48
19
  }
49
- options.cwd = cwd;
20
+ const packageName = configured.packageName ?? metadata?.packageName;
50
21
  return {
51
- kind: target,
22
+ ...configured,
52
23
  options,
53
- ...(configured?.packageName ? { packageName: configured.packageName } : {})
24
+ ...(packageName ? { packageName } : {})
54
25
  };
55
26
  }
56
27
  export function resolveDeployEnvironment(manifest, parsed, env = process.env) {
@@ -60,27 +31,8 @@ export function resolveDeployEnvironment(manifest, parsed, env = process.env) {
60
31
  ?? (typeof configured === "string" ? configured : undefined)
61
32
  ?? "development";
62
33
  }
63
- /** The environment deploys land in when --env/ASSEMBLY_LINE_DEPLOY_ENV are absent. */
64
34
  export function resolveDefaultDeployEnvironment(manifest) {
65
35
  const configured = manifest.gateway.deploy?.options?.environment;
66
36
  return typeof configured === "string" ? configured : "development";
67
37
  }
68
- function flagBoolean(parsed, name) {
69
- return parsed.flags[name] === undefined ? undefined : booleanFlag(parsed, name);
70
- }
71
- function jsonString(value) {
72
- return typeof value === "string" ? value : undefined;
73
- }
74
- function setString(options, name, value) {
75
- if (value !== undefined)
76
- options[name] = value;
77
- }
78
- function setNumber(options, name, value) {
79
- if (value !== undefined)
80
- options[name] = value;
81
- }
82
- function setBoolean(options, name, value) {
83
- if (value !== undefined)
84
- options[name] = value;
85
- }
86
38
  //# sourceMappingURL=deploy-definition.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deploy-definition.js","sourceRoot":"","sources":["../src/deploy-definition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deploy-definition.js","sourceRoot":"","sources":["../src/deploy-definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,OAAO,EAAE,UAAU,EAAmB,MAAM,WAAW,CAAC;AAExD,6FAA6F;AAC7F,MAAM,UAAU,uBAAuB,CACrC,QAAuB,EACvB,MAAc,EACd,MAAkB,EAClB,MAA0C,OAAO,CAAC,GAAG,EACrD,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAEnB,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC;IAC3C,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAC9C,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,+BAA+B,CAAC,CAAC;IAC1E,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAC9G,MAAM,OAAO,GAAe,EAAE,GAAG,CAAC,UAAU,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IACnE,MAAM,KAAK,GAAG;QACZ,WAAW,EAAE,wBAAwB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,CAAC;QAC5D,kBAAkB,EAAE,+BAA+B,CAAC,QAAQ,CAAC;KAC9D,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,UAAU,EAAE,wBAAwB,IAAI,EAAE,EAAE,CAAC;QACxE,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrG,CAAC;IACD,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,IAAI,QAAQ,EAAE,WAAW,CAAC;IACpE,OAAO;QACL,GAAG,UAAU;QACb,OAAO;QACP,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,QAAuB,EACvB,MAAkB,EAClB,MAA0C,OAAO,CAAC,GAAG;IAErD,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC;IACjE,OAAO,UAAU,CAAC,MAAM,EAAE,KAAK,CAAC;WAC3B,GAAG,CAAC,wBAAwB;WAC5B,CAAC,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;WACzD,aAAa,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,QAAuB;IACrE,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,WAAW,CAAC;IACjE,OAAO,OAAO,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC;AACrE,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { BuildArtifact, DeploymentPlan } from "@assemblyline-agents/compiler";
2
+ import type { DeployMigrationRequest } from "@assemblyline-agents/core";
3
+ import { type ParsedArgs } from "./args.js";
4
+ export declare function configuredMigrationRequest(artifact: BuildArtifact, parsed: ParsedArgs): DeployMigrationRequest;
5
+ export declare function runConfiguredMigrations(artifact: BuildArtifact, plan: DeploymentPlan, request: DeployMigrationRequest): Promise<string>;
6
+ export declare function runCommand(commandName: string, args: string[], options?: {
7
+ cwd?: string;
8
+ env?: NodeJS.ProcessEnv;
9
+ silent?: boolean;
10
+ }): Promise<{
11
+ exitCode: number;
12
+ stdout: string;
13
+ stderr: string;
14
+ }>;
15
+ //# sourceMappingURL=deploy-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-migrations.d.ts","sourceRoot":"","sources":["../src/deploy-migrations.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACxE,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAExD,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,aAAa,EACvB,MAAM,EAAE,UAAU,GACjB,sBAAsB,CAOxB;AAED,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,cAAc,EACpB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,wBAAgB,UAAU,CACxB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACxE,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA4B/D"}
@@ -0,0 +1,72 @@
1
+ import { spawn } from "node:child_process";
2
+ import { existsSync, readdirSync } from "node:fs";
3
+ import { resolve } from "node:path";
4
+ import { stringFlag } from "./args.js";
5
+ export function configuredMigrationRequest(artifact, parsed) {
6
+ const entries = migrationEntriesForArtifact(artifact);
7
+ const command = stringFlag(parsed, "migration-command") ?? process.env.ASSEMBLY_LINE_MIGRATION_COMMAND;
8
+ if (entries.length > 0 && !command) {
9
+ throw new Error("Migration files are present, but no migration runner was configured. Pass --migration-command or set ASSEMBLY_LINE_MIGRATION_COMMAND.");
10
+ }
11
+ return { entries, ...(command ? { command } : {}) };
12
+ }
13
+ export async function runConfiguredMigrations(artifact, plan, request) {
14
+ const entries = request.entries;
15
+ if (entries.length === 0)
16
+ return "none";
17
+ const commandName = request.command;
18
+ console.log(`Running ${entries.length} migration file(s) with ${commandName}.`);
19
+ const result = await runCommand(commandName, [], {
20
+ cwd: artifact.root,
21
+ env: {
22
+ ...process.env,
23
+ ASSEMBLY_LINE_ARTIFACT_ROOT: artifact.root,
24
+ ASSEMBLY_LINE_AGENT_REVISION: plan.agentRevision,
25
+ ASSEMBLY_LINE_DEPLOY_ENV: plan.environment,
26
+ ASSEMBLY_LINE_MIGRATION_FILES: JSON.stringify(entries)
27
+ }
28
+ });
29
+ if (result.exitCode !== 0)
30
+ throw new Error(`Migration command failed with exit code ${result.exitCode}.`);
31
+ return `ran:${entries.length}`;
32
+ }
33
+ export function runCommand(commandName, args, options = {}) {
34
+ return new Promise((resolvePromise, reject) => {
35
+ const child = spawn(commandName, args, {
36
+ cwd: options.cwd ?? process.cwd(),
37
+ env: options.env ?? process.env,
38
+ stdio: ["ignore", "pipe", "pipe"]
39
+ });
40
+ let stdout = "";
41
+ let stderr = "";
42
+ child.stdout.on("data", (chunk) => {
43
+ const text = chunk.toString("utf8");
44
+ stdout += text;
45
+ if (!options.silent)
46
+ process.stdout.write(text);
47
+ });
48
+ child.stderr.on("data", (chunk) => {
49
+ const text = chunk.toString("utf8");
50
+ stderr += text;
51
+ if (!options.silent)
52
+ process.stderr.write(text);
53
+ });
54
+ child.on("error", (error) => {
55
+ if (error.code === "ENOENT") {
56
+ reject(new Error(`${commandName} not found. Install it, or pass the matching --*-bin flag with the executable path.`));
57
+ return;
58
+ }
59
+ reject(error);
60
+ });
61
+ child.on("close", (code) => resolvePromise({ exitCode: code ?? 1, stdout, stderr }));
62
+ });
63
+ }
64
+ function migrationEntriesForArtifact(artifact) {
65
+ const migrationsDir = resolve(artifact.root, "migrations");
66
+ if (!existsSync(migrationsDir))
67
+ return [];
68
+ return readdirSync(migrationsDir)
69
+ .filter((entry) => entry !== "README.md" && !entry.startsWith("."))
70
+ .sort();
71
+ }
72
+ //# sourceMappingURL=deploy-migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-migrations.js","sourceRoot":"","sources":["../src/deploy-migrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { BuildArtifact, DeploymentPlan } from "@assemblyline-agents/compiler";
2
+ import type { AgentManifest, SandboxEnvironmentResolution } from "@assemblyline-agents/core";
3
+ export declare function preflightChannelInstallations(artifact: BuildArtifact, deployEnv: NodeJS.ProcessEnv): Promise<void>;
4
+ export declare function effectiveMissingRequirements(plan: DeploymentPlan, manifest: AgentManifest, reusableSandboxEnvironments?: Record<string, SandboxEnvironmentResolution>): DeploymentPlan["missingRequirements"];
5
+ export declare function printDeployWarnings(plan: DeploymentPlan): void;
6
+ //# sourceMappingURL=deploy-preflight.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-preflight.d.ts","sourceRoot":"","sources":["../src/deploy-preflight.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACnF,OAAO,KAAK,EAAE,aAAa,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAI7F,wBAAsB,6BAA6B,CACjD,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,MAAM,CAAC,UAAU,GAC3B,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,aAAa,EACvB,2BAA2B,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,GACzE,cAAc,CAAC,qBAAqB,CAAC,CAcvC;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI,CAI9D"}
@@ -0,0 +1,40 @@
1
+ import { AssemblyLineRuntime, loadRuntimeBundle } from "@assemblyline-agents/runtime";
2
+ import { checkChannelInstallations } from "./channels.js";
3
+ export async function preflightChannelInstallations(artifact, deployEnv) {
4
+ const runtime = new AssemblyLineRuntime({ ...loadRuntimeBundle(artifact.root), env: deployEnv });
5
+ const checks = await checkChannelInstallations(artifact.manifest, deployEnv, fetch, (channel) => runtime.loadCompiledChannelModule(channel));
6
+ for (const check of checks) {
7
+ const workspace = check.workspace ? ` (${check.workspace})` : "";
8
+ if (check.skipped) {
9
+ console.warn(`Channel preflight skipped for ${check.provider}${workspace}: ${check.detail}`);
10
+ continue;
11
+ }
12
+ if (!check.ok)
13
+ throw new Error(`Channel preflight failed for ${check.provider}${workspace}: ${check.detail}`);
14
+ console.log(`Channel preflight passed for ${check.provider}${workspace}.`);
15
+ if (check.missingOptionalScopes.length > 0) {
16
+ console.warn(`Optional ${check.provider} scopes not granted: ${check.missingOptionalScopes.join(", ")}.`);
17
+ }
18
+ }
19
+ }
20
+ export function effectiveMissingRequirements(plan, manifest, reusableSandboxEnvironments) {
21
+ let missing = plan.missingRequirements;
22
+ const deployMetadata = manifest.providerMetadata?.find((entry) => entry.kind === plan.target && entry.role === "deploy");
23
+ if (deployMetadata?.deployment?.remoteSecretValidation && !plan.dryRun) {
24
+ const sandboxKind = manifest.gateway.sandbox?.kind ?? "local";
25
+ const provisioningEnv = new Set(manifest.providerMetadata?.find((entry) => entry.kind === sandboxKind && entry.role === "sandbox")
26
+ ?.sandboxEnvironment?.provisioningEnv ?? []);
27
+ missing = missing.filter((requirement) => requirement.kind !== "env"
28
+ || requirement.adapter === plan.target
29
+ || (provisioningEnv.has(requirement.name) && !reusableSandboxEnvironments));
30
+ }
31
+ return missing;
32
+ }
33
+ export function printDeployWarnings(plan) {
34
+ if (plan.warnings.length === 0)
35
+ return;
36
+ console.warn("Deploy warnings:");
37
+ for (const warning of plan.warnings)
38
+ console.warn(`- ${warning.name}: ${warning.message}`);
39
+ }
40
+ //# sourceMappingURL=deploy-preflight.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-preflight.js","sourceRoot":"","sources":["../src/deploy-preflight.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { BuildArtifact, DeploymentPlan } from "@assemblyline-agents/compiler";
2
+ import { type ParsedArgs } from "./args.js";
3
+ export declare function environmentReceiptPath(artifactRoot: string, environment: string): string;
4
+ export declare function writeDeployReceipt(artifactRoot: string, plan: Pick<DeploymentPlan, "environment">, receipt: unknown): void;
5
+ export declare function removeDeployReceipts(artifactRoot: string, plan: Pick<DeploymentPlan, "environment">): void;
6
+ export declare function assertDestroyAllowed(plan: DeploymentPlan, parsed: ParsedArgs): void;
7
+ export declare function localDeployReceipt(artifact: BuildArtifact, plan: DeploymentPlan, status: string, deploymentUrl: string | null): Record<string, unknown>;
8
+ export declare function writeJson(path: string, value: unknown): void;
9
+ //# sourceMappingURL=deploy-receipts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-receipts.d.ts","sourceRoot":"","sources":["../src/deploy-receipts.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEnF,OAAO,EAAe,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAEzD,wBAAgB,sBAAsB,CAAC,YAAY,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAExF;AAED,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,EACzC,OAAO,EAAE,OAAO,GACf,IAAI,CAGN;AAED,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,GACxC,IAAI,CASN;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAMnF;AAED,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,MAAM,EACd,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAWzB;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAG5D"}
@@ -0,0 +1,45 @@
1
+ import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ import { sanitizeDeployName } from "@assemblyline-agents/core";
4
+ import { booleanFlag } from "./args.js";
5
+ export function environmentReceiptPath(artifactRoot, environment) {
6
+ return resolve(artifactRoot, "deployments", `${sanitizeDeployName(environment)}.json`);
7
+ }
8
+ export function writeDeployReceipt(artifactRoot, plan, receipt) {
9
+ writeJson(environmentReceiptPath(artifactRoot, plan.environment), receipt);
10
+ writeJson(resolve(artifactRoot, "deployment.json"), receipt);
11
+ }
12
+ export function removeDeployReceipts(artifactRoot, plan) {
13
+ rmSync(environmentReceiptPath(artifactRoot, plan.environment), { force: true });
14
+ const legacyPath = resolve(artifactRoot, "deployment.json");
15
+ try {
16
+ const legacy = JSON.parse(readFileSync(legacyPath, "utf8"));
17
+ if (legacy.environment === plan.environment)
18
+ rmSync(legacyPath, { force: true });
19
+ }
20
+ catch {
21
+ // An absent or unreadable legacy mirror is not a deploy receipt.
22
+ }
23
+ }
24
+ export function assertDestroyAllowed(plan, parsed) {
25
+ if (plan.environment === plan.defaultEnvironment && !booleanFlag(parsed, "force")) {
26
+ throw new Error(`Refusing to destroy the default environment "${plan.environment}" without --force. Alternate environments (--env <name>) are presumed disposable; the default one is not.`);
27
+ }
28
+ }
29
+ export function localDeployReceipt(artifact, plan, status, deploymentUrl) {
30
+ return {
31
+ target: "local",
32
+ status,
33
+ environment: plan.environment,
34
+ agentRevision: plan.agentRevision,
35
+ buildRevision: plan.buildRevision ?? plan.agentRevision,
36
+ artifactRoot: artifact.root,
37
+ deploymentUrl,
38
+ completedAt: new Date().toISOString()
39
+ };
40
+ }
41
+ export function writeJson(path, value) {
42
+ mkdirSync(dirname(path), { recursive: true });
43
+ writeFileSync(path, `${JSON.stringify(value, null, 2)}\n`);
44
+ }
45
+ //# sourceMappingURL=deploy-receipts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-receipts.js","sourceRoot":"","sources":["../src/deploy-receipts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAmB,MAAM,WAAW,CAAC;AAEzD,MAAM,UAAU,sBAAsB,CAAC,YAAoB,EAAE,WAAmB;IAC9E,OAAO,OAAO,CAAC,YAAY,EAAE,aAAa,EAAE,GAAG,kBAAkB,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,YAAoB,EACpB,IAAyC,EACzC,OAAgB;IAEhB,SAAS,CAAC,sBAAsB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;IAC3E,SAAS,CAAC,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,EAAE,OAAO,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,YAAoB,EACpB,IAAyC;IAEzC,MAAM,CAAC,sBAAsB,CAAC,YAAY,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAA8B,CAAC;QACzF,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW;YAAE,MAAM,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,iEAAiE;IACnE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAoB,EAAE,MAAkB;IAC3E,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,kBAAkB,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;QAClF,MAAM,IAAI,KAAK,CACb,gDAAgD,IAAI,CAAC,WAAW,2GAA2G,CAC5K,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,QAAuB,EACvB,IAAoB,EACpB,MAAc,EACd,aAA4B;IAE5B,OAAO;QACL,MAAM,EAAE,OAAO;QACf,MAAM;QACN,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,aAAa;QACvD,YAAY,EAAE,QAAQ,CAAC,IAAI;QAC3B,aAAa;QACb,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY,EAAE,KAAc;IACpD,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,aAAa,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { BuildArtifact } from "@assemblyline-agents/compiler";
2
+ import { type SandboxEnvironmentResolution } from "@assemblyline-agents/core";
3
+ export declare function sandboxEnvironmentReconciler(artifact: BuildArtifact, deployEnv: NodeJS.ProcessEnv, reusableResolutions?: Record<string, SandboxEnvironmentResolution>): (() => Promise<Record<string, SandboxEnvironmentResolution>>) | undefined;
4
+ export declare function reusableSandboxEnvironmentResolutions(artifact: Pick<BuildArtifact, "root" | "manifest">, environmentName: string): Record<string, SandboxEnvironmentResolution> | undefined;
5
+ export declare function sandboxPassthroughEnv(env: NodeJS.ProcessEnv, names: string[]): Record<string, string>;
6
+ //# sourceMappingURL=deploy-sandbox-environments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-sandbox-environments.d.ts","sourceRoot":"","sources":["../src/deploy-sandbox-environments.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAA6B,KAAK,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AAKzG,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,MAAM,CAAC,UAAU,EAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,GACjE,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC,CAAC,GAAG,SAAS,CAkC3E;AAED,wBAAgB,qCAAqC,CACnD,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,UAAU,CAAC,EAClD,eAAe,EAAE,MAAM,GACtB,MAAM,CAAC,MAAM,EAAE,4BAA4B,CAAC,GAAG,SAAS,CAsC1D;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWrG"}
@@ -0,0 +1,109 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { resolve } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { isSensitiveSandboxEnvName } from "@assemblyline-agents/core";
5
+ import { resolveProvider } from "@assemblyline-agents/node";
6
+ import { environmentReceiptPath } from "./deploy-receipts.js";
7
+ export function sandboxEnvironmentReconciler(artifact, deployEnv, reusableResolutions) {
8
+ const definition = artifact.manifest.gateway.sandbox;
9
+ if (!definition || definition.kind === "local")
10
+ return undefined;
11
+ const sandboxes = artifact.manifest.sandboxes.filter((candidate) => candidate.adapter === definition.kind && candidate.environment);
12
+ if (sandboxes.length === 0)
13
+ return undefined;
14
+ if (reusableResolutions)
15
+ return async () => reusableResolutions;
16
+ return async () => {
17
+ const provider = await resolveProvider("sandbox", definition, {
18
+ env: deployEnv,
19
+ fetch,
20
+ manifest: artifact.manifest,
21
+ artifactRoot: artifact.root,
22
+ providerRoot: fileURLToPath(new URL("..", import.meta.url)),
23
+ devMode: false
24
+ });
25
+ if (!provider.ensureEnvironment) {
26
+ throw new Error(`Sandbox provider ${definition.kind} cannot reconcile compiled environments.`);
27
+ }
28
+ const resolutions = {};
29
+ for (const sandbox of sandboxes) {
30
+ const environment = sandbox.environment;
31
+ if (!environment)
32
+ throw new Error(`Sandbox profile ${sandbox.name} has no compiled environment.`);
33
+ const passthroughEnv = sandboxPassthroughEnv(deployEnv, sandbox.env);
34
+ resolutions[sandbox.name] = await provider.ensureEnvironment({
35
+ agentId: artifact.manifest.agent.id ?? artifact.manifest.agent.name ?? "agent",
36
+ sandboxName: sandbox.name,
37
+ adapter: definition.kind,
38
+ artifactRoot: artifact.root,
39
+ environment,
40
+ ...(Object.keys(passthroughEnv).length > 0 ? { env: passthroughEnv } : {})
41
+ });
42
+ }
43
+ return resolutions;
44
+ };
45
+ }
46
+ export function reusableSandboxEnvironmentResolutions(artifact, environmentName) {
47
+ const definition = artifact.manifest.gateway.sandbox;
48
+ if (!definition || definition.kind === "local")
49
+ return undefined;
50
+ const sandboxes = artifact.manifest.sandboxes.filter((candidate) => candidate.adapter === definition.kind && candidate.environment);
51
+ if (sandboxes.length === 0)
52
+ return undefined;
53
+ const candidates = [
54
+ environmentReceiptPath(artifact.root, environmentName),
55
+ resolve(artifact.root, "deployment.json")
56
+ ];
57
+ for (const path of candidates) {
58
+ try {
59
+ const receipt = JSON.parse(readFileSync(path, "utf8"));
60
+ if (receipt.status !== "published" || receipt.environment !== environmentName)
61
+ continue;
62
+ const stored = receipt.sandboxEnvironments;
63
+ if (!stored || typeof stored !== "object" || Array.isArray(stored))
64
+ continue;
65
+ const resolutions = {};
66
+ let matches = true;
67
+ for (const sandbox of sandboxes) {
68
+ const fingerprint = sandbox.environment?.fingerprint;
69
+ const resolution = stored[sandbox.name];
70
+ if (!fingerprint
71
+ || !isSandboxEnvironmentResolution(resolution)
72
+ || resolution.provider !== definition.kind
73
+ || resolution.fingerprint !== fingerprint) {
74
+ matches = false;
75
+ break;
76
+ }
77
+ resolutions[sandbox.name] = { ...resolution, action: "reused" };
78
+ }
79
+ if (matches)
80
+ return resolutions;
81
+ }
82
+ catch {
83
+ // Missing, stale, or malformed receipts are not reuse evidence.
84
+ }
85
+ }
86
+ return undefined;
87
+ }
88
+ export function sandboxPassthroughEnv(env, names) {
89
+ const values = {};
90
+ for (const name of names) {
91
+ const value = env[name];
92
+ if (value !== undefined)
93
+ values[name] = value;
94
+ }
95
+ const sensitive = Object.keys(values).filter(isSensitiveSandboxEnvName);
96
+ if (sensitive.length > 0) {
97
+ throw new Error(`Refusing host/control-plane secrets in sandbox profile env: ${sensitive.join(", ")}.`);
98
+ }
99
+ return values;
100
+ }
101
+ function isSandboxEnvironmentResolution(value) {
102
+ if (!value || typeof value !== "object" || Array.isArray(value))
103
+ return false;
104
+ const record = value;
105
+ return ["provider", "artifactKind", "fingerprint", "artifactId", "runtimeReference"]
106
+ .every((key) => typeof record[key] === "string" && record[key].length > 0)
107
+ && ["reused", "built", "external"].includes(String(record.action));
108
+ }
109
+ //# sourceMappingURL=deploy-sandbox-environments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-sandbox-environments.js","sourceRoot":"","sources":["../src/deploy-sandbox-environments.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { type DeploymentPlan } from "@assemblyline-agents/compiler";
2
+ import type { AgentManifest, DeployPlan } from "@assemblyline-agents/core";
3
+ import { type ParsedArgs } from "./args.js";
4
+ export declare function resolveDeploySecretsEnv(manifest: AgentManifest, agentRoot: string, target: string): Promise<{
5
+ env: NodeJS.ProcessEnv;
6
+ storeNames: string[];
7
+ }>;
8
+ export declare function syncDeploySecretsIfRequested(publisher: {
9
+ target: string;
10
+ syncSecrets?(secrets: Record<string, string>, plan: DeployPlan): Promise<{
11
+ syncedKeys: string[];
12
+ skippedKeys: string[];
13
+ }>;
14
+ }, plan: DeploymentPlan, parsed: ParsedArgs, deployEnv: NodeJS.ProcessEnv): Promise<void>;
15
+ export declare function withDeclaredRuntimeEnv(fileSecrets: Record<string, string>, plan: DeploymentPlan, env: Record<string, string | undefined>): Record<string, string>;
16
+ export declare function splitDeploySecrets(secrets: Record<string, string>, plan: Pick<DeploymentPlan, "target" | "requirements" | "storeHeldCredentials" | "committedConfig">): {
17
+ runtimeSecrets: Record<string, string>;
18
+ localDeployKeys: string[];
19
+ storeHeldKeys: string[];
20
+ };
21
+ //# sourceMappingURL=deploy-secrets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy-secrets.d.ts","sourceRoot":"","sources":["../src/deploy-secrets.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+B,KAAK,cAAc,EAAE,MAAM,+BAA+B,CAAC;AACjG,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE3E,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,WAAW,CAAC;AAGrE,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,aAAa,EACvB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAU3D;AAED,wBAAsB,4BAA4B,CAChD,SAAS,EAAE;IACT,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC3H,EACD,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,UAAU,EAClB,SAAS,EAAE,MAAM,CAAC,UAAU,GAC3B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACnC,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACtC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAWxB;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,cAAc,GAAG,sBAAsB,GAAG,iBAAiB,CAAC,GACjG;IAAE,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,eAAe,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,EAAE,CAAA;CAAE,CAuBhG"}
@@ -0,0 +1,83 @@
1
+ import { existsSync } from "node:fs";
2
+ import { fileURLToPath } from "node:url";
3
+ import { deployTargetCredentialNames } from "@assemblyline-agents/compiler";
4
+ import { createCredentialBoundary, resolveCredentialInventory } from "@assemblyline-agents/node";
5
+ import { booleanFlag, stringFlag } from "./args.js";
6
+ import { readEnvSecretsFile } from "./project-env.js";
7
+ export async function resolveDeploySecretsEnv(manifest, agentRoot, target) {
8
+ const boundary = await createCredentialBoundary({
9
+ manifest,
10
+ env: process.env,
11
+ additionalCredentialNames: deployTargetCredentialNames(manifest, target),
12
+ artifactRoot: agentRoot,
13
+ providerRoot: fileURLToPath(new URL("..", import.meta.url)),
14
+ devMode: false
15
+ });
16
+ return resolveCredentialInventory(boundary);
17
+ }
18
+ export async function syncDeploySecretsIfRequested(publisher, plan, parsed, deployEnv) {
19
+ if (!booleanFlag(parsed, "sync-secrets"))
20
+ return;
21
+ if (!publisher.syncSecrets) {
22
+ console.warn(`Deploy target ${publisher.target} does not support secret sync; set variables on the target manually.`);
23
+ return;
24
+ }
25
+ const secretsPath = stringFlag(parsed, "secrets-from");
26
+ if (secretsPath && !existsSync(secretsPath)) {
27
+ throw new Error(`Secrets file not found: ${secretsPath}`);
28
+ }
29
+ const fileSecrets = secretsPath ? readEnvSecretsFile(secretsPath) : {};
30
+ const secrets = withDeclaredRuntimeEnv(fileSecrets, plan, deployEnv);
31
+ const { runtimeSecrets, localDeployKeys, storeHeldKeys } = splitDeploySecrets(secrets, plan);
32
+ if (localDeployKeys.length > 0) {
33
+ console.log(`Kept ${localDeployKeys.length} deploy credential(s) local: ${localDeployKeys.join(", ")}`);
34
+ }
35
+ if (storeHeldKeys.length > 0) {
36
+ console.log(`Left ${storeHeldKeys.length} credential(s) in the gateway secrets store (resolved just in time by the runtime broker, not synced): ${storeHeldKeys.join(", ")}`);
37
+ }
38
+ const receipt = await publisher.syncSecrets(runtimeSecrets, plan);
39
+ console.log(`Synced ${receipt.syncedKeys.length} secret(s) to ${publisher.target}: ${receipt.syncedKeys.join(", ") || "(none)"}`);
40
+ if (receipt.skippedKeys.length > 0) {
41
+ console.log(`Skipped ${receipt.skippedKeys.length} empty key(s): ${receipt.skippedKeys.join(", ")}`);
42
+ }
43
+ }
44
+ export function withDeclaredRuntimeEnv(fileSecrets, plan, env) {
45
+ const committedConfig = new Set(plan.committedConfig ?? []);
46
+ const secrets = Object.fromEntries(Object.entries(fileSecrets).filter(([name]) => !committedConfig.has(name)));
47
+ for (const requirement of plan.requirements) {
48
+ if (requirement.kind !== "env" || requirement.adapter === plan.target)
49
+ continue;
50
+ for (const key of [requirement.name, ...(requirement.alternatives ?? [])]) {
51
+ if (committedConfig.has(key))
52
+ continue;
53
+ if (env[key] !== undefined)
54
+ secrets[key] = env[key] ?? "";
55
+ }
56
+ }
57
+ return secrets;
58
+ }
59
+ export function splitDeploySecrets(secrets, plan) {
60
+ const storeHeld = new Set(plan.storeHeldCredentials ?? []);
61
+ const committedConfig = new Set(plan.committedConfig ?? []);
62
+ const deployKeys = new Set(plan.requirements
63
+ .filter((requirement) => requirement.kind === "env" && requirement.adapter === plan.target)
64
+ .flatMap((requirement) => [requirement.name, ...(requirement.alternatives ?? [])]));
65
+ const runtimeKeys = new Set(plan.requirements
66
+ .filter((requirement) => requirement.kind === "env" && requirement.adapter !== plan.target)
67
+ .flatMap((requirement) => [requirement.name, ...(requirement.alternatives ?? [])]));
68
+ const runtimeSecrets = {};
69
+ const localDeployKeys = [];
70
+ const storeHeldKeys = [];
71
+ for (const [key, value] of Object.entries(secrets)) {
72
+ if (committedConfig.has(key))
73
+ continue;
74
+ if (deployKeys.has(key) && !runtimeKeys.has(key))
75
+ localDeployKeys.push(key);
76
+ else if (storeHeld.has(key))
77
+ storeHeldKeys.push(key);
78
+ else
79
+ runtimeSecrets[key] = value;
80
+ }
81
+ return { runtimeSecrets, localDeployKeys, storeHeldKeys: storeHeldKeys.sort() };
82
+ }
83
+ //# sourceMappingURL=deploy-secrets.js.map