@ai-support-agent/cli 0.1.34-beta.1 → 0.1.35-beta.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.
Files changed (61) hide show
  1. package/dist/api-client.d.ts +6 -1
  2. package/dist/api-client.d.ts.map +1 -1
  3. package/dist/api-client.js +9 -0
  4. package/dist/api-client.js.map +1 -1
  5. package/dist/cli/ecs-publish-command.d.ts +49 -0
  6. package/dist/cli/ecs-publish-command.d.ts.map +1 -0
  7. package/dist/cli/ecs-publish-command.js +214 -0
  8. package/dist/cli/ecs-publish-command.js.map +1 -0
  9. package/dist/commands/index.d.ts.map +1 -1
  10. package/dist/commands/index.js +44 -0
  11. package/dist/commands/index.js.map +1 -1
  12. package/dist/constants.d.ts +30 -0
  13. package/dist/constants.d.ts.map +1 -1
  14. package/dist/constants.js +37 -2
  15. package/dist/constants.js.map +1 -1
  16. package/dist/ecs/aws-arn.d.ts +30 -0
  17. package/dist/ecs/aws-arn.d.ts.map +1 -0
  18. package/dist/ecs/aws-arn.js +36 -0
  19. package/dist/ecs/aws-arn.js.map +1 -0
  20. package/dist/ecs/ecr-publisher.d.ts +49 -0
  21. package/dist/ecs/ecr-publisher.d.ts.map +1 -0
  22. package/dist/ecs/ecr-publisher.js +118 -0
  23. package/dist/ecs/ecr-publisher.js.map +1 -0
  24. package/dist/ecs/ecs-launcher.d.ts +25 -0
  25. package/dist/ecs/ecs-launcher.d.ts.map +1 -0
  26. package/dist/ecs/ecs-launcher.js +157 -0
  27. package/dist/ecs/ecs-launcher.js.map +1 -0
  28. package/dist/ecs/launcher-capability.d.ts +26 -0
  29. package/dist/ecs/launcher-capability.d.ts.map +1 -0
  30. package/dist/ecs/launcher-capability.js +86 -0
  31. package/dist/ecs/launcher-capability.js.map +1 -0
  32. package/dist/ecs/task-definition-registrar.d.ts +39 -0
  33. package/dist/ecs/task-definition-registrar.d.ts.map +1 -0
  34. package/dist/ecs/task-definition-registrar.js +80 -0
  35. package/dist/ecs/task-definition-registrar.js.map +1 -0
  36. package/dist/index.js +17 -1
  37. package/dist/index.js.map +1 -1
  38. package/dist/locales/en.json +18 -0
  39. package/dist/locales/ja.json +18 -0
  40. package/dist/oneshot-runner.d.ts +38 -0
  41. package/dist/oneshot-runner.d.ts.map +1 -0
  42. package/dist/oneshot-runner.js +166 -0
  43. package/dist/oneshot-runner.js.map +1 -0
  44. package/dist/project-agent.d.ts.map +1 -1
  45. package/dist/project-agent.js +13 -1
  46. package/dist/project-agent.js.map +1 -1
  47. package/dist/types/command.d.ts +8 -1
  48. package/dist/types/command.d.ts.map +1 -1
  49. package/dist/types/command.js.map +1 -1
  50. package/dist/types/config.d.ts +6 -0
  51. package/dist/types/config.d.ts.map +1 -1
  52. package/dist/types/ecs.d.ts +71 -0
  53. package/dist/types/ecs.d.ts.map +1 -0
  54. package/dist/types/ecs.js +12 -0
  55. package/dist/types/ecs.js.map +1 -0
  56. package/dist/types/index.d.ts +1 -0
  57. package/dist/types/index.d.ts.map +1 -1
  58. package/dist/types/index.js +1 -0
  59. package/dist/types/index.js.map +1 -1
  60. package/docker/entrypoint.sh +9 -0
  61. package/package.json +6 -1
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+ /**
3
+ * ecs_launch capability detection.
4
+ *
5
+ * A resident agent should only advertise the `ecs_launch` capability when it
6
+ * can actually perform ECS RunTask/StopTask — i.e. when AWS credentials are
7
+ * resolvable through the default provider chain (env vars, shared
8
+ * config/credentials files, SSO cache, IMDS/ECS metadata, ...). Advertising
9
+ * it unconditionally would let the API's automatic launcher selection pick an
10
+ * agent that cannot launch anything, making ECS dispatch fail unpredictably.
11
+ *
12
+ * Override (checked before detection):
13
+ * AI_SUPPORT_AGENT_ECS_LAUNCHER=true force-enable, skip detection
14
+ * AI_SUPPORT_AGENT_ECS_LAUNCHER=false force-disable, skip detection
15
+ *
16
+ * The detection result is cached for the process lifetime so the register
17
+ * retry loop does not re-probe the credential chain (IMDS/STS) on every
18
+ * attempt.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.resetEcsLauncherCapabilityCache = resetEcsLauncherCapabilityCache;
22
+ exports.detectEcsLauncherCapability = detectEcsLauncherCapability;
23
+ const credential_providers_1 = require("@aws-sdk/credential-providers");
24
+ const constants_1 = require("../constants");
25
+ const logger_1 = require("../logger");
26
+ const utils_1 = require("../utils");
27
+ // Only a POSITIVE detection is cached for the process lifetime. A negative
28
+ // result (e.g. a transient 3s IMDS timeout during cold start) must NOT be
29
+ // sticky, or credentials that become available later would never be picked
30
+ // up. Re-detection on subsequent register attempts is safe because the
31
+ // register loop is backoff-based, so this cannot spam STS/IMDS.
32
+ let credentialsConfirmed = false;
33
+ /** Reset the positive-detection cache (tests only). */
34
+ function resetEcsLauncherCapabilityCache() {
35
+ credentialsConfirmed = false;
36
+ }
37
+ async function credentialsResolvable(timeoutMs) {
38
+ let timer;
39
+ try {
40
+ const timeout = new Promise((_, reject) => {
41
+ timer = setTimeout(() => reject(new Error(`credential resolution timed out after ${timeoutMs}ms`)), timeoutMs);
42
+ timer.unref?.();
43
+ });
44
+ const credentials = await Promise.race([(0, credential_providers_1.fromNodeProviderChain)()(), timeout]);
45
+ // Never log the credential values — only whether resolution succeeded.
46
+ return Boolean(credentials?.accessKeyId);
47
+ }
48
+ catch (error) {
49
+ logger_1.logger.info(`[ecs] AWS credentials not resolvable: ${(0, utils_1.getErrorMessage)(error)}`);
50
+ return false;
51
+ }
52
+ finally {
53
+ if (timer)
54
+ clearTimeout(timer);
55
+ }
56
+ }
57
+ /**
58
+ * Decide whether this agent should advertise the `ecs_launch` capability.
59
+ * Returns true when credentials are resolvable or force-enabled via env.
60
+ */
61
+ async function detectEcsLauncherCapability(env = process.env, timeoutMs = constants_1.ECS_LAUNCHER_DETECT_TIMEOUT_MS) {
62
+ const override = env[constants_1.ENV_VARS.ECS_LAUNCHER];
63
+ if (override === 'false') {
64
+ logger_1.logger.info(`[ecs] ecs_launch capability disabled (${constants_1.ENV_VARS.ECS_LAUNCHER}=false)`);
65
+ return false;
66
+ }
67
+ if (override === 'true') {
68
+ logger_1.logger.info(`[ecs] ecs_launch capability force-enabled (${constants_1.ENV_VARS.ECS_LAUNCHER}=true, credential detection skipped)`);
69
+ return true;
70
+ }
71
+ // A confirmed positive is sticky; a previous negative falls through to a
72
+ // fresh probe on the next call.
73
+ if (credentialsConfirmed) {
74
+ return true;
75
+ }
76
+ const resolved = await credentialsResolvable(timeoutMs);
77
+ if (resolved) {
78
+ credentialsConfirmed = true;
79
+ logger_1.logger.info('[ecs] AWS credentials resolved; advertising ecs_launch capability');
80
+ }
81
+ else {
82
+ logger_1.logger.info('[ecs] ecs_launch capability not advertised (no resolvable AWS credentials; will re-check on next registration)');
83
+ }
84
+ return resolved;
85
+ }
86
+ //# sourceMappingURL=launcher-capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"launcher-capability.js","sourceRoot":"","sources":["../../src/ecs/launcher-capability.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAgBH,0EAEC;AA2BD,kEA4BC;AAvED,wEAAqE;AAErE,4CAAuE;AACvE,sCAAkC;AAClC,oCAA0C;AAE1C,2EAA2E;AAC3E,0EAA0E;AAC1E,2EAA2E;AAC3E,uEAAuE;AACvE,gEAAgE;AAChE,IAAI,oBAAoB,GAAG,KAAK,CAAA;AAEhC,uDAAuD;AACvD,SAAgB,+BAA+B;IAC7C,oBAAoB,GAAG,KAAK,CAAA;AAC9B,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,SAAiB;IACpD,IAAI,KAAiC,CAAA;IACrC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/C,KAAK,GAAG,UAAU,CAChB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,yCAAyC,SAAS,IAAI,CAAC,CAAC,EAC/E,SAAS,CACV,CAAA;YACD,KAAK,CAAC,KAAK,EAAE,EAAE,CAAA;QACjB,CAAC,CAAC,CAAA;QACF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAA,4CAAqB,GAAE,EAAE,EAAE,OAAO,CAAC,CAAC,CAAA;QAC5E,uEAAuE;QACvE,OAAO,OAAO,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;IAC1C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,eAAM,CAAC,IAAI,CAAC,yCAAyC,IAAA,uBAAe,EAAC,KAAK,CAAC,EAAE,CAAC,CAAA;QAC9E,OAAO,KAAK,CAAA;IACd,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;AACH,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,2BAA2B,CAC/C,MAAyB,OAAO,CAAC,GAAG,EACpC,YAAoB,0CAA8B;IAElD,MAAM,QAAQ,GAAG,GAAG,CAAC,oBAAQ,CAAC,YAAY,CAAC,CAAA;IAC3C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,eAAM,CAAC,IAAI,CAAC,yCAAyC,oBAAQ,CAAC,YAAY,SAAS,CAAC,CAAA;QACpF,OAAO,KAAK,CAAA;IACd,CAAC;IACD,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,eAAM,CAAC,IAAI,CAAC,8CAA8C,oBAAQ,CAAC,YAAY,sCAAsC,CAAC,CAAA;QACtH,OAAO,IAAI,CAAA;IACb,CAAC;IAED,yEAAyE;IACzE,gCAAgC;IAChC,IAAI,oBAAoB,EAAE,CAAC;QACzB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,SAAS,CAAC,CAAA;IACvD,IAAI,QAAQ,EAAE,CAAC;QACb,oBAAoB,GAAG,IAAI,CAAA;QAC3B,eAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAA;IAClF,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,IAAI,CAAC,gHAAgH,CAAC,CAAA;IAC/H,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * ECS task definition registrar for `ecs publish`.
3
+ *
4
+ * Registers a Fargate task definition for the ECS execution agent:
5
+ * - image pinned by digest (`<repo>@sha256:...`)
6
+ * - awslogs log driver (log group created when missing)
7
+ * - NO environment variables in the task definition — COMMAND_ID, the
8
+ * oneshot token, etc. are injected per run via containerOverrides.
9
+ */
10
+ import { CloudWatchLogsClient } from '@aws-sdk/client-cloudwatch-logs';
11
+ export interface RegisterEcsTaskDefinitionOptions {
12
+ /** Task definition family: ai-support-ecs-agent-{tenantCode}-{agentId} */
13
+ family: string;
14
+ /** Digest-pinned image URI */
15
+ imageUri: string;
16
+ cpu: number;
17
+ memory: number;
18
+ region: string;
19
+ logGroupName: string;
20
+ /** Task execution role (required by Fargate for ECR pull / awslogs) */
21
+ executionRoleArn?: string;
22
+ /** Task role assumed by the container itself */
23
+ taskRoleArn?: string;
24
+ }
25
+ export interface RegisteredTaskDefinition {
26
+ taskDefinitionArn: string;
27
+ family: string;
28
+ revision: number;
29
+ }
30
+ /**
31
+ * Create the awslogs log group when it does not exist.
32
+ * ResourceAlreadyExistsException is tolerated (idempotent).
33
+ */
34
+ export declare function ensureLogGroup(client: CloudWatchLogsClient, logGroupName: string): Promise<void>;
35
+ /**
36
+ * Register the Fargate task definition and return its ARN.
37
+ */
38
+ export declare function registerTaskDefinition(options: RegisterEcsTaskDefinitionOptions): Promise<RegisteredTaskDefinition>;
39
+ //# sourceMappingURL=task-definition-registrar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-definition-registrar.d.ts","sourceRoot":"","sources":["../../src/ecs/task-definition-registrar.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,oBAAoB,EAErB,MAAM,iCAAiC,CAAA;AAMxC,MAAM,WAAW,gCAAgC;IAC/C,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAA;IACd,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAA;IAChB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,uEAAuE;IACvE,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,MAAM,CAAA;IACzB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,oBAAoB,EAC5B,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,wBAAwB,CAAC,CA0CnC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * ECS task definition registrar for `ecs publish`.
4
+ *
5
+ * Registers a Fargate task definition for the ECS execution agent:
6
+ * - image pinned by digest (`<repo>@sha256:...`)
7
+ * - awslogs log driver (log group created when missing)
8
+ * - NO environment variables in the task definition — COMMAND_ID, the
9
+ * oneshot token, etc. are injected per run via containerOverrides.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ensureLogGroup = ensureLogGroup;
13
+ exports.registerTaskDefinition = registerTaskDefinition;
14
+ const client_cloudwatch_logs_1 = require("@aws-sdk/client-cloudwatch-logs");
15
+ const client_ecs_1 = require("@aws-sdk/client-ecs");
16
+ const constants_1 = require("../constants");
17
+ const logger_1 = require("../logger");
18
+ /**
19
+ * Create the awslogs log group when it does not exist.
20
+ * ResourceAlreadyExistsException is tolerated (idempotent).
21
+ */
22
+ async function ensureLogGroup(client, logGroupName) {
23
+ try {
24
+ await client.send(new client_cloudwatch_logs_1.CreateLogGroupCommand({ logGroupName }));
25
+ logger_1.logger.info(`[ecs] Created log group: ${logGroupName}`);
26
+ }
27
+ catch (error) {
28
+ const name = error.name;
29
+ if (name === 'ResourceAlreadyExistsException') {
30
+ logger_1.logger.debug(`[ecs] Log group already exists: ${logGroupName}`);
31
+ return;
32
+ }
33
+ throw error;
34
+ }
35
+ }
36
+ /**
37
+ * Register the Fargate task definition and return its ARN.
38
+ */
39
+ async function registerTaskDefinition(options) {
40
+ const logsClient = new client_cloudwatch_logs_1.CloudWatchLogsClient({ region: options.region });
41
+ await ensureLogGroup(logsClient, options.logGroupName);
42
+ const ecsClient = new client_ecs_1.ECSClient({ region: options.region });
43
+ const response = await ecsClient.send(new client_ecs_1.RegisterTaskDefinitionCommand({
44
+ family: options.family,
45
+ requiresCompatibilities: ['FARGATE'],
46
+ networkMode: 'awsvpc',
47
+ cpu: String(options.cpu),
48
+ memory: String(options.memory),
49
+ ...(options.executionRoleArn && { executionRoleArn: options.executionRoleArn }),
50
+ ...(options.taskRoleArn && { taskRoleArn: options.taskRoleArn }),
51
+ containerDefinitions: [
52
+ {
53
+ name: constants_1.ECS_AGENT_CONTAINER_NAME,
54
+ image: options.imageUri,
55
+ essential: true,
56
+ // No environment variables here: they are injected at RunTask time
57
+ // via containerOverrides so secrets never persist in the definition.
58
+ logConfiguration: {
59
+ logDriver: 'awslogs',
60
+ options: {
61
+ 'awslogs-group': options.logGroupName,
62
+ 'awslogs-region': options.region,
63
+ 'awslogs-stream-prefix': 'ecs-agent',
64
+ },
65
+ },
66
+ },
67
+ ],
68
+ }));
69
+ const taskDefinition = response.taskDefinition;
70
+ if (!taskDefinition?.taskDefinitionArn) {
71
+ throw new Error('ECS RegisterTaskDefinition returned no task definition ARN');
72
+ }
73
+ logger_1.logger.success(`[ecs] Registered task definition: ${taskDefinition.taskDefinitionArn}`);
74
+ return {
75
+ taskDefinitionArn: taskDefinition.taskDefinitionArn,
76
+ family: taskDefinition.family ?? options.family,
77
+ revision: taskDefinition.revision ?? 0,
78
+ };
79
+ }
80
+ //# sourceMappingURL=task-definition-registrar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-definition-registrar.js","sourceRoot":"","sources":["../../src/ecs/task-definition-registrar.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;AAoCH,wCAeC;AAKD,wDA4CC;AAlGD,4EAGwC;AACxC,oDAA8E;AAE9E,4CAAuD;AACvD,sCAAkC;AAuBlC;;;GAGG;AACI,KAAK,UAAU,cAAc,CAClC,MAA4B,EAC5B,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,8CAAqB,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAA;QAC9D,eAAM,CAAC,IAAI,CAAC,4BAA4B,YAAY,EAAE,CAAC,CAAA;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,GAAI,KAA2B,CAAC,IAAI,CAAA;QAC9C,IAAI,IAAI,KAAK,gCAAgC,EAAE,CAAC;YAC9C,eAAM,CAAC,KAAK,CAAC,mCAAmC,YAAY,EAAE,CAAC,CAAA;YAC/D,OAAM;QACR,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,sBAAsB,CAC1C,OAAyC;IAEzC,MAAM,UAAU,GAAG,IAAI,6CAAoB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IACvE,MAAM,cAAc,CAAC,UAAU,EAAE,OAAO,CAAC,YAAY,CAAC,CAAA;IAEtD,MAAM,SAAS,GAAG,IAAI,sBAAS,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3D,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,0CAA6B,CAAC;QACtE,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,uBAAuB,EAAE,CAAC,SAAS,CAAC;QACpC,WAAW,EAAE,QAAQ;QACrB,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QACxB,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC/E,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;QAChE,oBAAoB,EAAE;YACpB;gBACE,IAAI,EAAE,oCAAwB;gBAC9B,KAAK,EAAE,OAAO,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI;gBACf,mEAAmE;gBACnE,qEAAqE;gBACrE,gBAAgB,EAAE;oBAChB,SAAS,EAAE,SAAS;oBACpB,OAAO,EAAE;wBACP,eAAe,EAAE,OAAO,CAAC,YAAY;wBACrC,gBAAgB,EAAE,OAAO,CAAC,MAAM;wBAChC,uBAAuB,EAAE,WAAW;qBACrC;iBACF;aACF;SACF;KACF,CAAC,CAAC,CAAA;IAEH,MAAM,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAA;IAC9C,IAAI,CAAC,cAAc,EAAE,iBAAiB,EAAE,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAA;IAC/E,CAAC;IACD,eAAM,CAAC,OAAO,CAAC,qCAAqC,cAAc,CAAC,iBAAiB,EAAE,CAAC,CAAA;IACvF,OAAO;QACL,iBAAiB,EAAE,cAAc,CAAC,iBAAiB;QACnD,MAAM,EAAE,cAAc,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM;QAC/C,QAAQ,EAAE,cAAc,CAAC,QAAQ,IAAI,CAAC;KACvC,CAAA;AACH,CAAC"}
package/dist/index.js CHANGED
@@ -37,6 +37,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
37
37
  const commander_1 = require("commander");
38
38
  const agent_runner_1 = require("./agent-runner");
39
39
  const auth_commands_1 = require("./cli/auth-commands");
40
+ const ecs_publish_command_1 = require("./cli/ecs-publish-command");
40
41
  const log_rotate_command_1 = require("./cli/log-rotate-command");
41
42
  const service_command_1 = require("./cli/service-command");
42
43
  const status_command_1 = require("./cli/status-command");
@@ -194,5 +195,20 @@ program
194
195
  (0, service_command_1.registerServiceCommands)(program);
195
196
  (0, set_project_dir_1.registerSetProjectDirCommand)(program);
196
197
  (0, log_rotate_command_1.registerLogRotateCommand)(program);
197
- program.parse();
198
+ (0, ecs_publish_command_1.registerEcsCommands)(program);
199
+ // ECS container mode: AGENT_MODE=oneshot (injected via RunTask
200
+ // containerOverrides) bypasses the CLI entirely and runs exactly one command
201
+ // (getCommand -> execute -> submitResult -> exit). See src/oneshot-runner.ts.
202
+ if (process.env[constants_1.ONESHOT_ENV_VARS.AGENT_MODE] === constants_1.AGENT_MODE_ONESHOT) {
203
+ // A rejection escaping here (e.g. the dynamic import itself failing) would
204
+ // otherwise leave the ECS container hanging with no exit — always exit 1.
205
+ Promise.resolve().then(() => __importStar(require('./oneshot-runner'))).then(({ runOneshotFromEnv }) => runOneshotFromEnv())
206
+ .catch((error) => {
207
+ logger_1.logger.error(`[oneshot] Fatal startup error: ${error instanceof Error ? error.message : String(error)}`);
208
+ process.exit(1);
209
+ });
210
+ }
211
+ else {
212
+ program.parse();
213
+ }
198
214
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -61,6 +61,24 @@
61
61
  "config.migrated": "Config migrated successfully.",
62
62
 
63
63
  "cmd.stop": "Stop the running agent",
64
+ "cmd.ecs": "ECS execution agent commands (launcher-agent architecture)",
65
+ "cmd.ecsPublish": "Build/push an image to ECR, register a task definition, and register the ECS execution agent with the API",
66
+ "cmd.ecsPublish.repositoryUri": "ECR repository URI to push the image to (required)",
67
+ "cmd.ecsPublish.tag": "Image tag (required)",
68
+ "cmd.ecsPublish.cluster": "Target ECS cluster ARN (required)",
69
+ "cmd.ecsPublish.subnets": "Subnet IDs for the awsvpc network configuration (required)",
70
+ "cmd.ecsPublish.securityGroups": "Security group IDs for the awsvpc network configuration (required)",
71
+ "cmd.ecsPublish.dockerfile": "Dockerfile used for the build",
72
+ "cmd.ecsPublish.image": "Use a pre-built local image (skips the build)",
73
+ "cmd.ecsPublish.cpu": "ECS task CPU units (default: 1024)",
74
+ "cmd.ecsPublish.memory": "ECS task memory in MiB (default: 2048)",
75
+ "cmd.ecsPublish.name": "Display name shown in the agent list",
76
+ "cmd.ecsPublish.assignPublicIp": "Assign a public IP to the task",
77
+ "cmd.ecsPublish.logGroup": "awslogs log group name (created when missing)",
78
+ "cmd.ecsPublish.executionRole": "ECS task execution role ARN (used for ECR pull / awslogs)",
79
+ "cmd.ecsPublish.taskRole": "ECS task role ARN assumed by the container",
80
+ "cmd.ecsPublish.launcherAgentId": "Resident agent id in charge of RunTask (auto-selected when omitted)",
81
+ "cmd.ecsPublish.project": "Target project (tenantCode/projectCode); optional when only one project is registered",
64
82
  "stop.stopping": "Sending stop signal to agent (PID: {{pid}})...",
65
83
  "stop.stopped": "Agent stopped.",
66
84
  "stop.notRunning": "No running agent found (pid file not found: {{path}})",
@@ -61,6 +61,24 @@
61
61
  "config.migrated": "設定の移行が完了しました。",
62
62
 
63
63
  "cmd.stop": "実行中のエージェントを停止",
64
+ "cmd.ecs": "ECS実行エージェント関連コマンド(ランチャーエージェント方式)",
65
+ "cmd.ecsPublish": "イメージをECRへビルド/プッシュし、タスク定義を登録してECS実行エージェントをAPIに登録",
66
+ "cmd.ecsPublish.repositoryUri": "イメージのプッシュ先ECRリポジトリURI(必須)",
67
+ "cmd.ecsPublish.tag": "イメージタグ(必須)",
68
+ "cmd.ecsPublish.cluster": "実行先ECSクラスターARN(必須)",
69
+ "cmd.ecsPublish.subnets": "awsvpcネットワーク設定のサブネットID(必須)",
70
+ "cmd.ecsPublish.securityGroups": "awsvpcネットワーク設定のセキュリティグループID(必須)",
71
+ "cmd.ecsPublish.dockerfile": "ビルドに使うDockerfile",
72
+ "cmd.ecsPublish.image": "ビルド済みローカルイメージを使用(ビルドをスキップ)",
73
+ "cmd.ecsPublish.cpu": "ECSタスクのCPUユニット(デフォルト: 1024)",
74
+ "cmd.ecsPublish.memory": "ECSタスクのメモリ(MiB)(デフォルト: 2048)",
75
+ "cmd.ecsPublish.name": "エージェント一覧に表示する名前",
76
+ "cmd.ecsPublish.assignPublicIp": "タスクにパブリックIPを割り当てる",
77
+ "cmd.ecsPublish.logGroup": "awslogsロググループ名(無ければ作成)",
78
+ "cmd.ecsPublish.executionRole": "ECSタスク実行ロールARN(ECR pull / awslogs用)",
79
+ "cmd.ecsPublish.taskRole": "コンテナが引き受けるECSタスクロールARN",
80
+ "cmd.ecsPublish.launcherAgentId": "RunTaskを担当する常駐エージェントID(省略時は自動選択)",
81
+ "cmd.ecsPublish.project": "対象プロジェクト(tenantCode/projectCode)。登録プロジェクトが1件の場合は省略可",
64
82
  "stop.stopping": "エージェントに停止シグナルを送信中 (PID: {{pid}})...",
65
83
  "stop.stopped": "エージェントを停止しました。",
66
84
  "stop.notRunning": "実行中のエージェントが見つかりません(pidファイルが存在しません: {{path}})",
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Oneshot runner (ECS container mode).
3
+ *
4
+ * When the CLI starts with AGENT_MODE=oneshot (set via containerOverrides at
5
+ * ECS RunTask time), it does NOT run the resident agent flow. Instead it:
6
+ * getCommand(COMMAND_ID) -> executeCommand -> submitResult -> exit
7
+ *
8
+ * There is no AppSync subscription, no heartbeat, and no register call.
9
+ * Authentication uses the short-lived oneshot token (AGENT_ONESHOT_TOKEN)
10
+ * scoped to the single COMMAND_ID. The token value is never logged.
11
+ */
12
+ interface OneshotEnv {
13
+ commandId: string;
14
+ agentId: string;
15
+ tenantCode: string;
16
+ projectCode: string;
17
+ apiBaseUrl: string;
18
+ token: string;
19
+ }
20
+ /**
21
+ * Read and validate the oneshot environment.
22
+ * Missing variables are a clear fatal error (no fallback).
23
+ */
24
+ export declare function readOneshotEnv(env?: NodeJS.ProcessEnv): OneshotEnv;
25
+ /**
26
+ * Run exactly one command and return the process exit code
27
+ * (0 = executed and submitted successfully, 1 = any failure).
28
+ */
29
+ export declare function runOneshot(env?: NodeJS.ProcessEnv): Promise<number>;
30
+ /**
31
+ * Entry-point wrapper used by src/index.ts: runs the oneshot flow and exits
32
+ * the process with the resulting code. Any unexpected rejection is converted
33
+ * into exit code 1 — a container that never exits would only be reclaimed by
34
+ * the slow timeout sweep. The runner is injectable for tests.
35
+ */
36
+ export declare function runOneshotFromEnv(runner?: () => Promise<number>): Promise<void>;
37
+ export {};
38
+ //# sourceMappingURL=oneshot-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneshot-runner.d.ts","sourceRoot":"","sources":["../src/oneshot-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAqCH,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,UAAU,CAa/E;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkFtF;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,GAAE,MAAM,OAAO,CAAC,MAAM,CAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CASjG"}
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ /**
3
+ * Oneshot runner (ECS container mode).
4
+ *
5
+ * When the CLI starts with AGENT_MODE=oneshot (set via containerOverrides at
6
+ * ECS RunTask time), it does NOT run the resident agent flow. Instead it:
7
+ * getCommand(COMMAND_ID) -> executeCommand -> submitResult -> exit
8
+ *
9
+ * There is no AppSync subscription, no heartbeat, and no register call.
10
+ * Authentication uses the short-lived oneshot token (AGENT_ONESHOT_TOKEN)
11
+ * scoped to the single COMMAND_ID. The token value is never logged.
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.readOneshotEnv = readOneshotEnv;
15
+ exports.runOneshot = runOneshot;
16
+ exports.runOneshotFromEnv = runOneshotFromEnv;
17
+ const api_client_1 = require("./api-client");
18
+ const commands_1 = require("./commands");
19
+ const constants_1 = require("./constants");
20
+ const logger_1 = require("./logger");
21
+ const types_1 = require("./types");
22
+ const utils_1 = require("./utils");
23
+ /**
24
+ * Command types the ECS oneshot runner is allowed to execute (Phase 1).
25
+ * The API only dispatches `execute_command` to ECS execution agents, but the
26
+ * runner enforces the same allowlist defensively: a mis-dispatched `chat` /
27
+ * `e2e_test` / `file_*` would otherwise run with a near-empty execution
28
+ * context (no projectDir/mcpConfigPath/serverConfig/browser callbacks) and
29
+ * silently misbehave. Anything outside this set is rejected up front.
30
+ */
31
+ const ONESHOT_SUPPORTED_COMMAND_TYPES = new Set([
32
+ 'execute_command',
33
+ ]);
34
+ /**
35
+ * Working directory for `execute_command` in the container. The ECS image
36
+ * sets WORKDIR /workspace; fall back to that when the shell executor would
37
+ * otherwise default to an undefined cwd.
38
+ */
39
+ const ONESHOT_DEFAULT_CWD = '/workspace';
40
+ const REQUIRED_ENV_KEYS = [
41
+ constants_1.ONESHOT_ENV_VARS.COMMAND_ID,
42
+ constants_1.ONESHOT_ENV_VARS.AGENT_ID,
43
+ constants_1.ONESHOT_ENV_VARS.TENANT_CODE,
44
+ constants_1.ONESHOT_ENV_VARS.PROJECT_CODE,
45
+ constants_1.ONESHOT_ENV_VARS.API_BASE_URL,
46
+ constants_1.ONESHOT_ENV_VARS.AGENT_ONESHOT_TOKEN,
47
+ ];
48
+ /**
49
+ * Read and validate the oneshot environment.
50
+ * Missing variables are a clear fatal error (no fallback).
51
+ */
52
+ function readOneshotEnv(env = process.env) {
53
+ const missing = REQUIRED_ENV_KEYS.filter((key) => !env[key]);
54
+ if (missing.length > 0) {
55
+ throw new Error(`Oneshot mode requires environment variables: ${missing.join(', ')}`);
56
+ }
57
+ return {
58
+ commandId: env[constants_1.ONESHOT_ENV_VARS.COMMAND_ID],
59
+ agentId: env[constants_1.ONESHOT_ENV_VARS.AGENT_ID],
60
+ tenantCode: env[constants_1.ONESHOT_ENV_VARS.TENANT_CODE],
61
+ projectCode: env[constants_1.ONESHOT_ENV_VARS.PROJECT_CODE],
62
+ apiBaseUrl: env[constants_1.ONESHOT_ENV_VARS.API_BASE_URL],
63
+ token: env[constants_1.ONESHOT_ENV_VARS.AGENT_ONESHOT_TOKEN],
64
+ };
65
+ }
66
+ /**
67
+ * Run exactly one command and return the process exit code
68
+ * (0 = executed and submitted successfully, 1 = any failure).
69
+ */
70
+ async function runOneshot(env = process.env) {
71
+ let oneshotEnv;
72
+ try {
73
+ oneshotEnv = readOneshotEnv(env);
74
+ }
75
+ catch (error) {
76
+ logger_1.logger.error(`[oneshot] ${(0, utils_1.getErrorMessage)(error)}`);
77
+ return 1;
78
+ }
79
+ const { commandId, agentId, tenantCode, projectCode, apiBaseUrl } = oneshotEnv;
80
+ logger_1.logger.info(`[oneshot] Starting oneshot execution: commandId=${commandId} agentId=${agentId}`);
81
+ let client;
82
+ try {
83
+ client = new api_client_1.ApiClient(apiBaseUrl, oneshotEnv.token);
84
+ }
85
+ catch (error) {
86
+ logger_1.logger.error(`[oneshot] Failed to initialize API client: ${(0, utils_1.getErrorMessage)(error)}`);
87
+ return 1;
88
+ }
89
+ // The oneshot token uses the same "{tenantCode}:{tokenId}:{secret}" format
90
+ // as resident agent tokens, so the ApiClient constructor already derives a
91
+ // tenant code from it. TENANT_CODE from the environment is still applied
92
+ // explicitly as the authoritative value (dispatch injects both together).
93
+ client.setTenantCode(tenantCode);
94
+ client.setProjectCode(projectCode);
95
+ const submit = async (result) => {
96
+ try {
97
+ await client.submitResult(commandId, result, agentId);
98
+ return true;
99
+ }
100
+ catch (error) {
101
+ logger_1.logger.error(`[oneshot] Failed to submit result: ${(0, utils_1.getErrorMessage)(error)}`);
102
+ return false;
103
+ }
104
+ };
105
+ let command;
106
+ try {
107
+ command = await client.getCommand(commandId, agentId);
108
+ }
109
+ catch (error) {
110
+ const message = `Failed to fetch command ${commandId}: ${(0, utils_1.getErrorMessage)(error)}`;
111
+ logger_1.logger.error(`[oneshot] ${message}`);
112
+ // Best effort: let the API mark the work command as failed right away
113
+ // instead of waiting for the timeout sweep.
114
+ await submit((0, types_1.errorResult)(message));
115
+ return 1;
116
+ }
117
+ if (!ONESHOT_SUPPORTED_COMMAND_TYPES.has(command.type)) {
118
+ const supported = [...ONESHOT_SUPPORTED_COMMAND_TYPES].join(', ');
119
+ const message = `Command type "${command.type}" is not supported in ECS oneshot mode (supported: ${supported})`;
120
+ logger_1.logger.error(`[oneshot] ${message}`);
121
+ // Submit as a visible failure rather than running with an incomplete
122
+ // execution context and misbehaving silently.
123
+ await submit((0, types_1.errorResult)(message));
124
+ return 1;
125
+ }
126
+ // execute_command's shell executor falls back to os.homedir() when cwd is
127
+ // absent; pin it to the container's working dir for predictable behavior.
128
+ const payload = { ...command.payload };
129
+ if (payload.cwd === undefined || payload.cwd === null || payload.cwd === '') {
130
+ payload.cwd = ONESHOT_DEFAULT_CWD;
131
+ }
132
+ logger_1.logger.info(`[oneshot] Executing command: type=${command.type}`);
133
+ const result = await (0, commands_1.executeCommand)(command.type, payload, {
134
+ commandId,
135
+ client,
136
+ agentId,
137
+ tenantCode,
138
+ });
139
+ const submitted = await submit(result);
140
+ if (!submitted)
141
+ return 1;
142
+ if (!result.success) {
143
+ logger_1.logger.error('[oneshot] Command execution failed; result submitted');
144
+ return 1;
145
+ }
146
+ logger_1.logger.success('[oneshot] Command executed and result submitted');
147
+ return 0;
148
+ }
149
+ /**
150
+ * Entry-point wrapper used by src/index.ts: runs the oneshot flow and exits
151
+ * the process with the resulting code. Any unexpected rejection is converted
152
+ * into exit code 1 — a container that never exits would only be reclaimed by
153
+ * the slow timeout sweep. The runner is injectable for tests.
154
+ */
155
+ async function runOneshotFromEnv(runner = runOneshot) {
156
+ let exitCode = 1;
157
+ try {
158
+ exitCode = await runner();
159
+ }
160
+ catch (error) {
161
+ logger_1.logger.error(`[oneshot] Fatal error: ${(0, utils_1.getErrorMessage)(error)}`);
162
+ exitCode = 1;
163
+ }
164
+ process.exit(exitCode);
165
+ }
166
+ //# sourceMappingURL=oneshot-runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneshot-runner.js","sourceRoot":"","sources":["../src/oneshot-runner.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"project-agent.d.ts","sourceRoot":"","sources":["../src/project-agent.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAIxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AA0BjD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAoB,MAAM,SAAS,CAAA;AAMnF,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,qBAAa,YAAY;IAgDrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhD1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAAQ;IAE3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAQ/B;IAED,OAAO,CAAC,cAAc,CAAgB;IAEtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAO9B;IAED,OAAO,CAAC,aAAa,CAAe;IAKpC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,uBAAuB,CAA+B;IAI9D,OAAO,CAAC,iBAAiB,CAAoD;IAC7E,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,uBAAuB,CAA8C;gBAG3E,OAAO,EAAE,mBAAmB,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,EAC7C,kBAAkB,CAAC,EAAE,aAAa,EAClC,iBAAiB,CAAC,EAAE,MAAM;IAqD5B,KAAK,IAAI,IAAI;IAab,IAAI,IAAI,IAAI;IAcZ,MAAM,IAAI,OAAO;IAIjB,SAAS,IAAI,SAAS;IAItB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAgB7B,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IASlC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAIvF,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCrC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YA0CtB,gBAAgB;IAwB9B;;;;;;OAMG;YACW,mBAAmB;IAyEjC;;;;;;OAMG;YACW,aAAa;YA+Eb,eAAe;IA2E7B,OAAO,CAAC,gBAAgB;CAezB"}
1
+ {"version":3,"file":"project-agent.d.ts","sourceRoot":"","sources":["../src/project-agent.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAIxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AA2BjD,OAAO,KAAK,EAAE,aAAa,EAAE,mBAAmB,EAAoB,MAAM,SAAS,CAAA;AAMnF,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAA;IACpB,iBAAiB,EAAE,MAAM,CAAA;CAC1B;AAED,qBAAa,YAAY;IAgDrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAhD1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAW;IAClC,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAAQ;IAE3B,OAAO,CAAC,QAAQ,CAAC,eAAe,CAQ/B;IAED,OAAO,CAAC,cAAc,CAAgB;IAEtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAO9B;IAED,OAAO,CAAC,aAAa,CAAe;IAKpC,OAAO,CAAC,aAAa,CAAQ;IAC7B,OAAO,CAAC,qBAAqB,CAAQ;IACrC,OAAO,CAAC,eAAe,CAAI;IAC3B,OAAO,CAAC,uBAAuB,CAA+B;IAI9D,OAAO,CAAC,iBAAiB,CAAoD;IAC7E,OAAO,CAAC,iBAAiB,CAA8C;IACvE,OAAO,CAAC,uBAAuB,CAA8C;gBAG3E,OAAO,EAAE,mBAAmB,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,mBAAmB,EAC7C,kBAAkB,CAAC,EAAE,aAAa,EAClC,iBAAiB,CAAC,EAAE,MAAM;IAqD5B,KAAK,IAAI,IAAI;IAab,IAAI,IAAI,IAAI;IAcZ,MAAM,IAAI,OAAO;IAIjB,SAAS,IAAI,SAAS;IAItB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAgB7B,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;IASlC,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAI7B,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAIvF,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAkB9B,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAsCrC,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;YA0CtB,gBAAgB;IAwB9B;;;;;;OAMG;YACW,mBAAmB;IAoFjC;;;;;;OAMG;YACW,aAAa;YA+Eb,eAAe;IA2E7B,OAAO,CAAC,gBAAgB;CAezB"}
@@ -45,6 +45,7 @@ const agent_transport_1 = require("./agent-transport");
45
45
  const constants_1 = require("./constants");
46
46
  const retry_strategy_1 = require("./retry-strategy");
47
47
  const config_manager_1 = require("./config-manager");
48
+ const launcher_capability_1 = require("./ecs/launcher-capability");
48
49
  const i18n_1 = require("./i18n");
49
50
  const logger_1 = require("./logger");
50
51
  const project_dir_1 = require("./project-dir");
@@ -328,13 +329,24 @@ class ProjectAgent {
328
329
  * Throws on failure so the caller's retry loop can apply exponential backoff.
329
330
  */
330
331
  async performRegistration() {
332
+ // 'ecs_launch' advertises that this resident agent can act as the
333
+ // launcher for ECS execution agents (RunTask/StopTask via its local AWS
334
+ // credentials); the API's automatic launcher selection matches on it.
335
+ // Declared only when AWS credentials are resolvable (or force-enabled
336
+ // via AI_SUPPORT_AGENT_ECS_LAUNCHER) — see ecs/launcher-capability.ts.
337
+ // The detection is cached for the process lifetime, so register retries
338
+ // do not re-probe the credential chain.
339
+ const ecsLauncher = await (0, launcher_capability_1.detectEcsLauncherCapability)();
331
340
  const result = await this.client.register({
332
341
  agentId: this.agentId,
333
342
  hostname: os.hostname(),
334
343
  os: os.platform(),
335
344
  arch: os.arch(),
336
345
  ipAddress: (0, system_info_1.getLocalIpAddress)(),
337
- capabilities: ['shell', 'file_read', 'file_write', 'process_manage', 'chat', 'terminal', 'vscode'],
346
+ capabilities: [
347
+ 'shell', 'file_read', 'file_write', 'process_manage', 'chat', 'terminal', 'vscode',
348
+ ...(ecsLauncher ? ['ecs_launch'] : []),
349
+ ],
338
350
  availableChatModes: this.configSyncState.availableChatModes,
339
351
  activeChatMode: this.configSyncState.activeChatMode,
340
352
  });