anycloud 0.0.12 → 0.0.14

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.
Binary file
Binary file
Binary file
Binary file
@@ -5,17 +5,17 @@ import { resolveAndPushImage } from '../services/docker.js';
5
5
  export function createBuildCommand() {
6
6
  return new Command('build')
7
7
  .description('🔨 Build and push container image to registry')
8
- .argument('[tag]', 'Optional tag for the image (default: git commit hash + latest)')
8
+ .option('-t, --tag <tag>', 'Tag for the image (default: latest)')
9
9
  .option('-f, --force', 'Allow build with uncommitted changes')
10
10
  .addHelpText('after', `
11
11
  Examples:
12
- $ anycloud build # Build from Dockerfile, push to ghcr.io
12
+ $ anycloud build # Build from Dockerfile, push as :latest
13
+ $ anycloud build -t v1.0 # Build and push as :v1.0
13
14
  $ anycloud build --force # Build even with uncommitted changes
14
15
 
15
16
  Output:
16
- Building and pushing to: ghcr.io/user/repo:latest (abc12345)
17
+ Building and pushing to: ghcr.io/user/repo:latest
17
18
  ✓ Build complete
18
- ✓ Pushed ghcr.io/user/repo:abc12345
19
19
  ✓ Pushed ghcr.io/user/repo:latest
20
20
 
21
21
  Image: ghcr.io/user/repo:latest
@@ -23,7 +23,7 @@ Output:
23
23
  Deploy with:
24
24
  anycloud run ghcr.io/user/repo:latest --config <config>
25
25
  `)
26
- .action(async (_tag, options) => {
26
+ .action(async (options) => {
27
27
  try {
28
28
  // Get GitHub token and username
29
29
  const accessToken = await getGitHubToken();
@@ -31,7 +31,7 @@ Output:
31
31
  // Build and push image
32
32
  console.log('');
33
33
  const finalImage = await resolveAndPushImage(undefined, // Always build from Dockerfile
34
- accessToken, githubUsername, options.force);
34
+ accessToken, githubUsername, options.force, options.tag);
35
35
  console.log('');
36
36
  printInfo(`Image: ${finalImage}`);
37
37
  console.log('');
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;SACxB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,QAAQ,CACP,OAAO,EACP,gEAAgE,CACjE;SACA,MAAM,CAAC,aAAa,EAAE,sCAAsC,CAAC;SAC7D,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;CAeL,CACI;SACA,MAAM,CACL,KAAK,EACH,IAAwB,EACxB,OAEC,EACD,EAAE;QACF,IAAI,CAAC;YACH,gCAAgC;YAChC,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;YAC3C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAE5D,uBAAuB;YACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAC1C,SAAS,EAAE,+BAA+B;YAC1C,WAAW,EACX,cAAc,EACd,OAAO,CAAC,KAAK,CACd,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,SAAS,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,SAAS,CAAC,cAAc,CAAC,CAAC;YAC1B,SAAS,CAAC,kBAAkB,UAAU,oBAAoB,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../../src/cli/commands/build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,UAAU,kBAAkB;IAChC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC;SACxB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,iBAAiB,EAAE,qCAAqC,CAAC;SAChE,MAAM,CAAC,aAAa,EAAE,sCAAsC,CAAC;SAC7D,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;CAeL,CACI;SACA,MAAM,CAAC,KAAK,EAAE,OAA0C,EAAE,EAAE;QAC3D,IAAI,CAAC;YACH,gCAAgC;YAChC,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;YAC3C,MAAM,cAAc,GAAG,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAE5D,uBAAuB;YACvB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAC1C,SAAS,EAAE,+BAA+B;YAC1C,WAAW,EACX,cAAc,EACd,OAAO,CAAC,KAAK,EACb,OAAO,CAAC,GAAG,CACZ,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAEhB,SAAS,CAAC,UAAU,UAAU,EAAE,CAAC,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,SAAS,CAAC,cAAc,CAAC,CAAC;YAC1B,SAAS,CAAC,kBAAkB,UAAU,oBAAoB,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,28 +1,36 @@
1
1
  import { Command } from 'commander';
2
- import { startServer } from '../../../daemon/server.js';
3
2
  import { log } from '../../../daemon/logger.js';
4
- import { DeploymentType } from '../../../shared/types.js';
3
+ import { Coordinator } from '../../../daemon/cluster.js';
5
4
  export function createDaemonCommand() {
6
5
  return new Command('daemon')
7
6
  .description('Start the AnyCloud daemon (runs on VMs)')
8
- .argument('<secret>', 'Deployment secret for authentication')
7
+ .argument('<props-json>', 'JSON string containing DeploymentProps')
9
8
  .argument('<conductor-url>', 'URL of the conductor to connect to')
10
- .requiredOption('--type <type>', 'Deployment type: server or job')
11
- .action(async (secret, conductorUrl, options) => {
9
+ .action(async (propsJson, conductorUrl) => {
12
10
  try {
13
- // Validate deployment type
14
- if (options.type !== DeploymentType.Server &&
15
- options.type !== DeploymentType.Job) {
16
- log.error('Invalid deployment type. Must be either "server" or "job"');
17
- process.exit(1);
18
- }
19
- const deploymentType = options.type;
11
+ // Parse deployment props from JSON string
12
+ const deploymentProps = JSON.parse(propsJson);
20
13
  log.info('Starting AnyCloud Daemon', {
21
- deploymentType,
14
+ deploymentId: deploymentProps.id,
15
+ deploymentType: deploymentProps.deploymentType,
22
16
  nodeVersion: process.version,
23
17
  });
24
- await startServer(secret, conductorUrl);
18
+ // Setup process handlers
19
+ setupProcessHandlers();
20
+ // Create coordinator and start
21
+ const coordinator = new Coordinator();
22
+ await coordinator.start(conductorUrl, deploymentProps);
23
+ // Graceful shutdown
24
+ const shutdown = async () => {
25
+ log.info('Shutdown signal received');
26
+ await coordinator.stop();
27
+ process.exit(0);
28
+ };
29
+ process.on('SIGTERM', shutdown);
30
+ process.on('SIGINT', shutdown);
25
31
  log.info('Daemon started successfully');
32
+ // Keep process alive
33
+ await new Promise(() => { });
26
34
  }
27
35
  catch (error) {
28
36
  log.error('Failed to start daemon', error);
@@ -30,4 +38,16 @@ export function createDaemonCommand() {
30
38
  }
31
39
  });
32
40
  }
41
+ function setupProcessHandlers() {
42
+ process.on('uncaughtException', (error) => {
43
+ log.error('Uncaught exception', {
44
+ error: error.message,
45
+ stack: error.stack,
46
+ });
47
+ setTimeout(() => process.exit(1), 1000);
48
+ });
49
+ process.on('unhandledRejection', (reason) => {
50
+ log.warn('Unhandled promise rejection', { reason: String(reason) });
51
+ });
52
+ }
33
53
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAuB,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE/E,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,yCAAyC,CAAC;SACtD,QAAQ,CAAC,UAAU,EAAE,sCAAsC,CAAC;SAC5D,QAAQ,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SACjE,cAAc,CAAC,eAAe,EAAE,gCAAgC,CAAC;SACjE,MAAM,CACL,KAAK,EACH,MAAc,EACd,YAAoB,EACpB,OAAyB,EACzB,EAAE;QACF,IAAI,CAAC;YACH,2BAA2B;YAC3B,IACE,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,MAAM;gBACtC,OAAO,CAAC,IAAI,KAAK,cAAc,CAAC,GAAG,EACnC,CAAC;gBACD,GAAG,CAAC,KAAK,CACP,2DAA2D,CAC5D,CAAC;gBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,cAAc,GAAG,OAAO,CAAC,IAA2B,CAAC;YAE3D,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE;gBACnC,cAAc;gBACd,WAAW,EAAE,OAAO,CAAC,OAAO;aAC7B,CAAC,CAAC;YAEH,MAAM,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAExC,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CACF,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/daemon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAGzD,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC;SACzB,WAAW,CAAC,yCAAyC,CAAC;SACtD,QAAQ,CAAC,cAAc,EAAE,wCAAwC,CAAC;SAClE,QAAQ,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;SACjE,MAAM,CAAC,KAAK,EAAE,SAAiB,EAAE,YAAoB,EAAE,EAAE;QACxD,IAAI,CAAC;YACH,0CAA0C;YAC1C,MAAM,eAAe,GAAoB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YAE/D,GAAG,CAAC,IAAI,CAAC,0BAA0B,EAAE;gBACnC,YAAY,EAAE,eAAe,CAAC,EAAE;gBAChC,cAAc,EAAE,eAAe,CAAC,cAAc;gBAC9C,WAAW,EAAE,OAAO,CAAC,OAAO;aAC7B,CAAC,CAAC;YAEH,yBAAyB;YACzB,oBAAoB,EAAE,CAAC;YAEvB,+BAA+B;YAC/B,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;YACtC,MAAM,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;YAEvD,oBAAoB;YACpB,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;gBAC1B,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;gBACrC,MAAM,WAAW,CAAC,IAAI,EAAE,CAAC;gBACzB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC,CAAC;YAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YAChC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAE/B,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAExC,qBAAqB;YACrB,MAAM,IAAI,OAAO,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,oBAAoB;IAC3B,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,KAAY,EAAE,EAAE;QAC/C,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE;YAC9B,KAAK,EAAE,KAAK,CAAC,OAAO;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QACH,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAe,EAAE,EAAE;QACnD,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -4,15 +4,8 @@ import { getGitHubToken } from '../services/auth.js';
4
4
  import { getDockerLogs, listDeployments } from '../services/api-client.js';
5
5
  import { printInfo, printError, createSpinner } from '../utils/output.js';
6
6
  import { isNonInteractive, getEnvOptional, } from '../services/non-interactive.js';
7
- import { DeploymentState } from '../../shared/types.js';
7
+ import { stateEmoji } from '../../shared/types.js';
8
8
  import packageJson from '../../../package.json' with { type: 'json' };
9
- const stateEmoji = {
10
- [DeploymentState.Provisioning]: '🟡',
11
- [DeploymentState.Running]: '🟢',
12
- [DeploymentState.Failed]: '🔴',
13
- [DeploymentState.Terminating]: '🟠',
14
- [DeploymentState.Terminated]: '⚫',
15
- };
16
9
  export function createLogsCommand() {
17
10
  return new Command('logs')
18
11
  .description('📝 Get container logs')
@@ -75,7 +68,7 @@ Output:
75
68
  return {
76
69
  title: deployment.id,
77
70
  value: deployment.id,
78
- description: `${emoji} ${deployment.state}`,
71
+ description: `${emoji} ${deployment.state}`,
79
72
  };
80
73
  }),
81
74
  });
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../src/cli/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,gBAAgB,EAChB,cAAc,GACf,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,WAAW,MAAM,uBAAuB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAEtE,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;SACvB,WAAW,CAAC,uBAAuB,CAAC;SACpC,QAAQ,CACP,MAAM,EACN,kEAAkE,CACnE;SACA,MAAM,CAAC,YAAY,EAAE,4CAA4C,EAAE,KAAK,CAAC;SACzE,WAAW,CACV,OAAO,EACP;;;;;;;;;;;;;;;;;;;;CAoBL,CACI;SACA,MAAM,CAAC,KAAK,EAAE,EAAW,EAAE,OAA0B,EAAE,EAAE;QACxD,IAAI,CAAC;YACH,IAAI,YAAY,GAAG,EAAE,CAAC;YAEtB,oDAAoD;YACpD,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,yDAAyD;gBACzD,IAAI,gBAAgB,EAAE,EAAE,CAAC;oBACvB,YAAY,GAAG,cAAc,CAAC,wBAAwB,CAAC,CAAC;oBACxD,IAAI,CAAC,YAAY,EAAE,CAAC;wBAClB,UAAU,CACR,iDAAiD;4BAC/C,+EAA+E,CAClF,CAAC;wBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,mBAAmB;oBACnB,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;oBAE3C,uCAAuC;oBACvC,MAAM,cAAc,GAAG,aAAa,CAClC,wBAAwB,CACzB,CAAC,KAAK,EAAE,CAAC;oBACV,MAAM,WAAW,GAAG,MAAM,eAAe,CACvC,WAAW,EACX,WAAW,CAAC,OAAO,CACpB,CAAC;oBACF,cAAc,CAAC,IAAI,EAAE,CAAC;oBAEtB,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAC7B,UAAU,CAAC,uBAAuB,CAAC,CAAC;wBACpC,SAAS,CACP,8EAA8E,CAC/E,CAAC;wBACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBAClB,CAAC;oBAED,kCAAkC;oBAClC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC;wBAC9B,IAAI,EAAE,QAAQ;wBACd,IAAI,EAAE,YAAY;wBAClB,OAAO,EAAE,oBAAoB;wBAC7B,OAAO,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;4BACtC,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC;4BAClD,OAAO;gCACL,KAAK,EAAE,UAAU,CAAC,EAAE;gCACpB,KAAK,EAAE,UAAU,CAAC,EAAE;gCACpB,WAAW,EAAE,GAAG,KAAK,KAAK,UAAU,CAAC,KAAK,EAAE;6BAC7C,CAAC;wBACJ,CAAC,CAAC;qBACH,CAAC,CAAC;oBAEH,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;wBAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAiB;oBACpC,CAAC;oBAED,YAAY,GAAG,SAAS,CAAC,UAAU,CAAC;gBACtC,CAAC;YACH,CAAC;YAED,4CAA4C;YAC5C,MAAM,WAAW,GAAG,MAAM,cAAc,EAAE,CAAC;YAE3C,oBAAoB;YACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBAC5B,UAAU,CAAC,kDAAkD,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,kBAAkB;YAClB,MAAM,OAAO,GAAG,aAAa,CAC3B,6BAA6B,YAAY,KAAK,CAC/C,CAAC,KAAK,EAAE,CAAC;YACV,MAAM,QAAQ,GAAG,MAAM,aAAa,CAClC,YAAY,EACZ,WAAW,EACX,WAAW,CAAC,OAAO,EACnB,IAAI,CACL,CAAC;YACF,OAAO,CAAC,IAAI,EAAE,CAAC;YAEf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,UAAU,CAAC,yBAA0B,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAChE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -15,10 +15,10 @@ import { resolveAndPushImage } from '../services/docker.js';
15
15
  import { getGitHubUsername } from '../services/auth.js';
16
16
  import packageJson from '../../../package.json' with { type: 'json' };
17
17
  /**
18
- * Fetch package versions and return ImageChoice entries
18
+ * Fetch all tags for a specific package
19
19
  */
20
- async function fetchPackageVersions(token, owner, packageName, isOrg) {
21
- const images = [];
20
+ async function fetchPackageTags(token, owner, packageName, isOrg) {
21
+ const tags = [];
22
22
  const baseUrl = isOrg
23
23
  ? `https://api.github.com/orgs/${owner}/packages/container/${packageName}/versions`
24
24
  : `https://api.github.com/user/packages/container/${packageName}/versions`;
@@ -31,32 +31,27 @@ async function fetchPackageVersions(token, owner, packageName, isOrg) {
31
31
  });
32
32
  if (versionsResponse.ok) {
33
33
  const versions = (await versionsResponse.json());
34
- // Get tags from first few versions
35
- for (const version of versions.slice(0, 5)) {
36
- const tags = version.metadata?.container?.tags || [];
37
- for (const tag of tags.slice(0, 3)) {
38
- const full = `ghcr.io/${owner}/${packageName}:${tag}`;
39
- images.push({
40
- name: `ghcr.io/${owner}/${packageName}`,
41
- tag,
42
- full,
43
- owner,
44
- isOrg,
45
- });
34
+ // Collect all tags from versions
35
+ for (const version of versions) {
36
+ const versionTags = version.metadata?.container?.tags || [];
37
+ for (const tag of versionTags) {
38
+ if (!tags.includes(tag)) {
39
+ tags.push(tag);
40
+ }
46
41
  }
47
42
  }
48
43
  }
49
44
  }
50
45
  catch {
51
- // Skip this package on error
46
+ // Return empty on error
52
47
  }
53
- return images;
48
+ return tags;
54
49
  }
55
50
  /**
56
- * List GitHub Container Registry packages for authenticated user and their orgs
51
+ * List GitHub Container Registry packages (repos) for authenticated user and their orgs
57
52
  */
58
53
  async function listGitHubPackages(token) {
59
- const images = [];
54
+ const repos = [];
60
55
  try {
61
56
  // Get authenticated user
62
57
  const userResponse = await fetch('https://api.github.com/user', {
@@ -86,18 +81,20 @@ async function listGitHubPackages(token) {
86
81
  // Process user's packages
87
82
  if (userPackagesResponse.ok) {
88
83
  const packages = (await userPackagesResponse.json());
89
- // Fetch versions for user packages (limit to 10)
90
- const userVersionPromises = packages
91
- .slice(0, 10)
92
- .map((pkg) => fetchPackageVersions(token, user.login, pkg.name, false));
93
- const userImages = await Promise.all(userVersionPromises);
94
- images.push(...userImages.flat());
84
+ for (const pkg of packages) {
85
+ repos.push({
86
+ name: `ghcr.io/${user.login}/${pkg.name}`,
87
+ owner: user.login,
88
+ packageName: pkg.name,
89
+ isOrg: false,
90
+ });
91
+ }
95
92
  }
96
93
  // Process org packages
97
94
  if (orgsResponse.ok) {
98
95
  const orgs = (await orgsResponse.json());
99
- // Fetch packages for each org in parallel (limit to 5 orgs)
100
- const orgPackagePromises = orgs.slice(0, 5).map(async (org) => {
96
+ // Fetch packages for each org in parallel
97
+ const orgPackagePromises = orgs.map(async (org) => {
101
98
  try {
102
99
  const orgPackagesResponse = await fetch(`https://api.github.com/orgs/${org.login}/packages?package_type=container`, {
103
100
  headers: {
@@ -108,21 +105,21 @@ async function listGitHubPackages(token) {
108
105
  if (!orgPackagesResponse.ok)
109
106
  return [];
110
107
  const orgPackages = (await orgPackagesResponse.json());
111
- // Fetch versions for org packages (limit to 10 per org)
112
- const versionPromises = orgPackages
113
- .slice(0, 10)
114
- .map((pkg) => fetchPackageVersions(token, org.login, pkg.name, true));
115
- const orgImages = await Promise.all(versionPromises);
116
- return orgImages.flat();
108
+ return orgPackages.map((pkg) => ({
109
+ name: `ghcr.io/${org.login}/${pkg.name}`,
110
+ owner: org.login,
111
+ packageName: pkg.name,
112
+ isOrg: true,
113
+ }));
117
114
  }
118
115
  catch {
119
116
  return [];
120
117
  }
121
118
  });
122
- const allOrgImages = await Promise.all(orgPackagePromises);
123
- images.push(...allOrgImages.flat());
119
+ const allOrgRepos = await Promise.all(orgPackagePromises);
120
+ repos.push(...allOrgRepos.flat());
124
121
  }
125
- return images;
122
+ return repos;
126
123
  }
127
124
  catch {
128
125
  return [];
@@ -249,61 +246,77 @@ Output:
249
246
  ' Provide image as first argument.');
250
247
  process.exit(1);
251
248
  }
252
- const spinner = createSpinner('Loading available images...').start();
253
- // Load GitHub packages
254
- const ghcrImages = await listGitHubPackages(accessToken);
249
+ const spinner = createSpinner('Loading available repos...').start();
250
+ // Load GitHub packages (repos)
251
+ const repos = await listGitHubPackages(accessToken);
255
252
  spinner.stop();
256
- // Dedupe images to show only most recent tag per image name
257
- const seenGhcrImages = new Set();
258
- const dedupedGhcrImages = ghcrImages.filter((img) => {
259
- if (seenGhcrImages.has(img.name))
260
- return false;
261
- seenGhcrImages.add(img.name);
262
- return true;
263
- });
264
- // Build choices for selection
265
- const choices = [];
266
- // Add existing GHCR images (personal first, then orgs)
267
- const personalImages = dedupedGhcrImages.filter((img) => !img.isOrg);
268
- const orgImages = dedupedGhcrImages.filter((img) => img.isOrg);
269
- for (const img of personalImages) {
270
- choices.push({
271
- title: img.full,
272
- value: img.full,
253
+ // Build choices for repo selection
254
+ const repoChoices = [];
255
+ // Add existing repos (personal first, then orgs)
256
+ const personalRepos = repos.filter((r) => !r.isOrg);
257
+ const orgRepos = repos.filter((r) => r.isOrg);
258
+ for (const repo of personalRepos) {
259
+ repoChoices.push({
260
+ title: repo.name,
261
+ value: repo,
273
262
  description: 'personal',
274
263
  });
275
264
  }
276
- for (const img of orgImages) {
277
- choices.push({
278
- title: img.full,
279
- value: img.full,
280
- description: `org: ${img.owner}`,
265
+ for (const repo of orgRepos) {
266
+ repoChoices.push({
267
+ title: repo.name,
268
+ value: repo,
269
+ description: `org: ${repo.owner}`,
281
270
  });
282
271
  }
283
272
  // Add option to build new image
284
- choices.push({
273
+ repoChoices.push({
285
274
  title: 'Build and push a new image from local dir',
286
275
  value: '__build__',
287
276
  description: 'Build from Dockerfile in current directory',
288
277
  });
289
278
  console.log('');
290
- const selection = await prompts({
279
+ const repoSelection = await prompts({
291
280
  type: 'select',
292
- name: 'image',
293
- message: 'Select image to deploy:',
294
- choices,
281
+ name: 'repo',
282
+ message: 'Select repo:',
283
+ choices: repoChoices,
295
284
  });
296
- if (!selection.image) {
285
+ if (!repoSelection.repo) {
297
286
  process.exit(0);
298
287
  }
299
- if (selection.image === '__build__') {
288
+ if (repoSelection.repo === '__build__') {
300
289
  // Build and push new image
301
290
  const githubUsername = await getGitHubUsername(accessToken);
302
291
  console.log('');
303
292
  image = await resolveAndPushImage(undefined, accessToken, githubUsername);
304
293
  }
305
294
  else {
306
- image = selection.image;
295
+ // Fetch tags for the selected repo
296
+ const selectedRepo = repoSelection.repo;
297
+ const tagSpinner = createSpinner(`Loading tags for ${selectedRepo.packageName}...`).start();
298
+ const tags = await fetchPackageTags(accessToken, selectedRepo.owner, selectedRepo.packageName, selectedRepo.isOrg);
299
+ tagSpinner.stop();
300
+ if (tags.length === 0) {
301
+ printError(`No tags found for ${selectedRepo.name}`);
302
+ process.exit(1);
303
+ }
304
+ // Build choices for tag selection
305
+ const tagChoices = tags.map((tag) => ({
306
+ title: tag,
307
+ value: tag,
308
+ }));
309
+ console.log('');
310
+ const tagSelection = await prompts({
311
+ type: 'select',
312
+ name: 'tag',
313
+ message: 'Select tag:',
314
+ choices: tagChoices,
315
+ });
316
+ if (!tagSelection.tag) {
317
+ process.exit(0);
318
+ }
319
+ image = `${selectedRepo.name}:${tagSelection.tag}`;
307
320
  }
308
321
  }
309
322
  // Parse environment variables from file if provided
@@ -1 +1 @@
1
- {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/cli/commands/run.ts"],"names":[],"mappings":"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"}
@@ -4,14 +4,37 @@ import { getGitHubToken } from '../services/auth.js';
4
4
  import { getDeploymentStatus, listDeployments, } from '../services/api-client.js';
5
5
  import { printInfo, printError, createSpinner } from '../utils/output.js';
6
6
  import { isNonInteractive, getEnvOptional, } from '../services/non-interactive.js';
7
- import { DeploymentState } from '../../shared/types.js';
7
+ import { DeploymentState, stateEmoji } from '../../shared/types.js';
8
8
  import packageJson from '../../../package.json' with { type: 'json' };
9
- const stateEmoji = {
10
- [DeploymentState.Provisioning]: '🟡',
11
- [DeploymentState.Running]: '🟢',
12
- [DeploymentState.Failed]: '🔴',
13
- [DeploymentState.Terminating]: '🟠',
14
- [DeploymentState.Terminated]: '⚫',
9
+ // Strip Docker log stream headers (non-printable chars at start of lines)
10
+ const cleanLogLine = (line) => {
11
+ let start = 0;
12
+ while (start < line.length && line.charCodeAt(start) < 32)
13
+ start++;
14
+ return line.slice(start).trim();
15
+ };
16
+ // Truncate line to max length
17
+ const truncate = (line, max = 60) => line.length > max ? line.slice(0, max - 3) + '...' : line;
18
+ // Format error logs with box drawing character
19
+ const formatErrorLogs = (logs) => {
20
+ const lines = logs
21
+ .split('\n')
22
+ .map(cleanLogLine)
23
+ .filter((l) => l.length > 0)
24
+ .slice(-5)
25
+ .map((l) => ` │ ${truncate(l)}`);
26
+ return lines.length > 0 ? [' │', ...lines, ' │'] : [];
27
+ };
28
+ // Extract pid and uptime from supervisor status like "anycloud-daemon RUNNING pid 16393, uptime 0:59:27"
29
+ const parseDaemonStatus = (status) => {
30
+ const match = status.match(/(\w+)\s+(\w+)\s+pid\s+(\d+),\s+uptime\s+([\d:]+)/);
31
+ if (match) {
32
+ return {
33
+ state: match[2].toLowerCase(),
34
+ details: `pid ${match[3]}, ${match[4]}`,
35
+ };
36
+ }
37
+ return { state: status };
15
38
  };
16
39
  export function createStatusCommand() {
17
40
  return new Command('status')
@@ -23,12 +46,20 @@ Examples:
23
46
  $ anycloud status
24
47
 
25
48
  Output:
26
- anycloud-123153255 🟢 running
49
+ ☁️ deployed
27
50
 
28
51
  VMs:
29
- 1.2.3.4 healthy
52
+ 1.2.3.4
53
+ ✓ container running
54
+ ✓ daemon running (pid 16393, 0:59:27)
55
+ ✓ bucket active
30
56
 
31
- [16:33:01 UTC] Deployment complete!
57
+ [07:23:05 UTC] Deploying your service...
58
+ [07:23:37 UTC] Standard_B2s node at Azure westus2 is creating...
59
+ [07:24:01 UTC] Standard_B2s node 1.2.3.4 at Azure westus2 is waiting...
60
+ [07:24:15 UTC] Standard_B2s node 1.2.3.4 at Azure westus2 is starting...
61
+ [07:24:30 UTC] Standard_B2s node 1.2.3.4 at Azure westus2 is ready...
62
+ [07:24:30 UTC] Deployment complete!
32
63
  `)
33
64
  .action(async (id) => {
34
65
  try {
@@ -53,9 +84,8 @@ Output:
53
84
  const deployments = await listDeployments(accessToken, packageJson.version);
54
85
  loadingSpinner.stop();
55
86
  if (deployments.length === 0) {
56
- printError('No deployments found.');
57
- printInfo('Create a deployment first using: anycloud run <image> --config <config-name>');
58
- process.exit(1);
87
+ printInfo('No deployments found.');
88
+ process.exit(0);
59
89
  }
60
90
  // Prompt for deployment selection
61
91
  const selection = await prompts({
@@ -67,7 +97,7 @@ Output:
67
97
  return {
68
98
  title: deployment.id,
69
99
  value: { id: deployment.id, state: deployment.state },
70
- description: `${emoji} ${deployment.state}`,
100
+ description: `${emoji} ${deployment.state}`,
71
101
  };
72
102
  }),
73
103
  });
@@ -88,23 +118,55 @@ Output:
88
118
  const spinner = createSpinner(`Fetching status...`).start();
89
119
  const response = await getDeploymentStatus(deploymentId, accessToken, packageJson.version);
90
120
  spinner.stop();
91
- // Header: ID + state
121
+ // Header: state only (ID already shown in selection or logs)
92
122
  const emoji = deploymentState
93
123
  ? stateEmoji[deploymentState] || '❓'
94
124
  : '❓';
95
125
  const stateText = deploymentState || 'unknown';
96
126
  console.log('');
97
- console.log(`${deploymentId} ${emoji} ${stateText}`);
127
+ console.log(`${emoji} ${stateText}`);
98
128
  console.log('');
99
129
  // Show per-VM status if available
100
130
  if (response.vmStatuses && response.vmStatuses.length > 0) {
131
+ const isPending = deploymentState === DeploymentState.Starting;
101
132
  console.log('VMs:');
102
133
  response.vmStatuses.forEach((vm) => {
103
- const icon = vm.healthy ? '✓' : '✗';
104
- const healthText = vm.healthy ? 'healthy' : 'unhealthy';
105
- console.log(` ${icon} ${vm.ip} ${healthText}`);
134
+ console.log(` ${vm.ip}`);
135
+ // Container status
136
+ const containerOk = vm.container?.healthy ?? false;
137
+ const containerIcon = isPending ? '◌' : containerOk ? '✓' : '✗';
138
+ const containerState = isPending
139
+ ? 'pending'
140
+ : vm.container?.state || 'unknown';
141
+ console.log(` ${containerIcon} container ${containerState}`);
142
+ if (!isPending && !containerOk && vm.container?.logs) {
143
+ formatErrorLogs(vm.container.logs).forEach((line) => console.log(line));
144
+ }
145
+ // Daemon status
146
+ const daemonOk = vm.daemon?.running ?? false;
147
+ const daemonIcon = isPending ? '◌' : daemonOk ? '✓' : '✗';
148
+ const daemonStatus = isPending
149
+ ? { state: 'pending' }
150
+ : parseDaemonStatus(vm.daemon?.status || 'unknown');
151
+ const daemonLine = daemonStatus.details
152
+ ? `${daemonStatus.state} (${daemonStatus.details})`
153
+ : daemonStatus.state;
154
+ console.log(` ${daemonIcon} daemon ${daemonLine}`);
155
+ if (!isPending && !daemonOk && vm.daemon?.logs) {
156
+ formatErrorLogs(vm.daemon.logs).forEach((line) => console.log(line));
157
+ }
158
+ // Bucket sync status (omit if not configured)
159
+ if (vm.rclone && !vm.rclone.status.includes('no such process')) {
160
+ const bucketOk = vm.rclone.active ?? false;
161
+ const bucketIcon = isPending ? '◌' : bucketOk ? '✓' : '✗';
162
+ const bucketState = isPending ? 'pending' : vm.rclone.status;
163
+ console.log(` ${bucketIcon} bucket ${bucketState}`);
164
+ if (!isPending && !bucketOk && vm.rclone.logs) {
165
+ formatErrorLogs(vm.rclone.logs).forEach((line) => console.log(line));
166
+ }
167
+ }
168
+ console.log('');
106
169
  });
107
- console.log('');
108
170
  }
109
171
  // Logs (no dividers)
110
172
  if (response.message.trim()) {