@ai-support-agent/cli 0.1.35 → 0.2.0-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.
- package/dist/agent-config-sync.d.ts.map +1 -1
- package/dist/agent-config-sync.js +8 -1
- package/dist/agent-config-sync.js.map +1 -1
- package/dist/api-client.d.ts +6 -1
- package/dist/api-client.d.ts.map +1 -1
- package/dist/api-client.js +9 -0
- package/dist/api-client.js.map +1 -1
- package/dist/chat-mode-detector.d.ts +2 -1
- package/dist/chat-mode-detector.d.ts.map +1 -1
- package/dist/chat-mode-detector.js +21 -4
- package/dist/chat-mode-detector.js.map +1 -1
- package/dist/cli/ecs-publish-command.d.ts +49 -0
- package/dist/cli/ecs-publish-command.d.ts.map +1 -0
- package/dist/cli/ecs-publish-command.js +214 -0
- package/dist/cli/ecs-publish-command.js.map +1 -0
- package/dist/commands/chat-executor.d.ts +1 -0
- package/dist/commands/chat-executor.d.ts.map +1 -1
- package/dist/commands/chat-executor.js +34 -18
- package/dist/commands/chat-executor.js.map +1 -1
- package/dist/commands/codex-command.d.ts +7 -0
- package/dist/commands/codex-command.d.ts.map +1 -0
- package/dist/commands/codex-command.js +34 -0
- package/dist/commands/codex-command.js.map +1 -0
- package/dist/commands/codex-runner.d.ts +37 -0
- package/dist/commands/codex-runner.d.ts.map +1 -0
- package/dist/commands/codex-runner.js +264 -0
- package/dist/commands/codex-runner.js.map +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +44 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/constants.d.ts +32 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +40 -3
- package/dist/constants.js.map +1 -1
- package/dist/ecs/aws-arn.d.ts +30 -0
- package/dist/ecs/aws-arn.d.ts.map +1 -0
- package/dist/ecs/aws-arn.js +36 -0
- package/dist/ecs/aws-arn.js.map +1 -0
- package/dist/ecs/ecr-publisher.d.ts +49 -0
- package/dist/ecs/ecr-publisher.d.ts.map +1 -0
- package/dist/ecs/ecr-publisher.js +118 -0
- package/dist/ecs/ecr-publisher.js.map +1 -0
- package/dist/ecs/ecs-launcher.d.ts +25 -0
- package/dist/ecs/ecs-launcher.d.ts.map +1 -0
- package/dist/ecs/ecs-launcher.js +157 -0
- package/dist/ecs/ecs-launcher.js.map +1 -0
- package/dist/ecs/launcher-capability.d.ts +26 -0
- package/dist/ecs/launcher-capability.d.ts.map +1 -0
- package/dist/ecs/launcher-capability.js +86 -0
- package/dist/ecs/launcher-capability.js.map +1 -0
- package/dist/ecs/task-definition-registrar.d.ts +39 -0
- package/dist/ecs/task-definition-registrar.d.ts.map +1 -0
- package/dist/ecs/task-definition-registrar.js +80 -0
- package/dist/ecs/task-definition-registrar.js.map +1 -0
- package/dist/index.js +17 -1
- package/dist/index.js.map +1 -1
- package/dist/locales/en.json +18 -0
- package/dist/locales/ja.json +18 -0
- package/dist/oneshot-runner.d.ts +38 -0
- package/dist/oneshot-runner.d.ts.map +1 -0
- package/dist/oneshot-runner.js +166 -0
- package/dist/oneshot-runner.js.map +1 -0
- package/dist/project-agent.d.ts.map +1 -1
- package/dist/project-agent.js +13 -1
- package/dist/project-agent.js.map +1 -1
- package/dist/types/command.d.ts +8 -1
- package/dist/types/command.d.ts.map +1 -1
- package/dist/types/command.js.map +1 -1
- package/dist/types/config.d.ts +8 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/ecs.d.ts +71 -0
- package/dist/types/ecs.d.ts.map +1 -0
- package/dist/types/ecs.js +12 -0
- package/dist/types/ecs.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/project.d.ts +5 -0
- package/dist/types/project.d.ts.map +1 -1
- package/dist/types/server.d.ts +5 -0
- package/dist/types/server.d.ts.map +1 -1
- package/docker/Dockerfile +1 -1
- package/docker/entrypoint.sh +9 -0
- package/package.json +7 -1
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Launcher-side handlers for the `ecs_launch` / `ecs_stop` commands.
|
|
4
|
+
*
|
|
5
|
+
* A resident agent with local AWS credentials acts as the "launcher": it
|
|
6
|
+
* receives `ecs_launch` via the normal dispatch path (AppSync) and starts a
|
|
7
|
+
* oneshot ECS task with RunTask, injecting the per-run environment
|
|
8
|
+
* (COMMAND_ID, oneshot token, ...) through containerOverrides.
|
|
9
|
+
*
|
|
10
|
+
* SECURITY: the containerEnv payload contains AGENT_ONESHOT_TOKEN. Its
|
|
11
|
+
* values must never be logged — only log resource identifiers.
|
|
12
|
+
*/
|
|
13
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.ecsLaunch = ecsLaunch;
|
|
15
|
+
exports.ecsStop = ecsStop;
|
|
16
|
+
const client_ecs_1 = require("@aws-sdk/client-ecs");
|
|
17
|
+
const aws_arn_1 = require("./aws-arn");
|
|
18
|
+
const constants_1 = require("../constants");
|
|
19
|
+
const logger_1 = require("../logger");
|
|
20
|
+
const types_1 = require("../types");
|
|
21
|
+
const utils_1 = require("../utils");
|
|
22
|
+
function parseStringArray(value) {
|
|
23
|
+
if (!Array.isArray(value) || value.length === 0)
|
|
24
|
+
return null;
|
|
25
|
+
if (!value.every((v) => typeof v === 'string' && v.length > 0))
|
|
26
|
+
return null;
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
function validateLaunchPayload(p) {
|
|
30
|
+
const taskDefinitionArn = typeof p.taskDefinitionArn === 'string' && p.taskDefinitionArn ? p.taskDefinitionArn : null;
|
|
31
|
+
if (!taskDefinitionArn)
|
|
32
|
+
return 'taskDefinitionArn is required for ecs_launch';
|
|
33
|
+
const clusterArn = typeof p.clusterArn === 'string' && p.clusterArn ? p.clusterArn : null;
|
|
34
|
+
if (!clusterArn)
|
|
35
|
+
return 'clusterArn is required for ecs_launch';
|
|
36
|
+
const subnetIds = parseStringArray(p.subnetIds);
|
|
37
|
+
if (!subnetIds)
|
|
38
|
+
return 'subnetIds (non-empty string array) is required for ecs_launch';
|
|
39
|
+
const securityGroupIds = parseStringArray(p.securityGroupIds);
|
|
40
|
+
if (!securityGroupIds)
|
|
41
|
+
return 'securityGroupIds (non-empty string array) is required for ecs_launch';
|
|
42
|
+
const rawEnv = p.containerEnv;
|
|
43
|
+
if (typeof rawEnv !== 'object' || rawEnv === null || Array.isArray(rawEnv)) {
|
|
44
|
+
return 'containerEnv (object) is required for ecs_launch';
|
|
45
|
+
}
|
|
46
|
+
const containerEnv = {};
|
|
47
|
+
for (const [key, value] of Object.entries(rawEnv)) {
|
|
48
|
+
if (typeof value !== 'string') {
|
|
49
|
+
return `containerEnv.${key} must be a string`;
|
|
50
|
+
}
|
|
51
|
+
containerEnv[key] = value;
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
taskDefinitionArn,
|
|
55
|
+
clusterArn,
|
|
56
|
+
subnetIds,
|
|
57
|
+
securityGroupIds,
|
|
58
|
+
assignPublicIp: p.assignPublicIp === true,
|
|
59
|
+
containerEnv,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Handle the `ecs_launch` command: RunTask (FARGATE, awsvpc) with the
|
|
64
|
+
* payload's containerEnv injected via containerOverrides.
|
|
65
|
+
* Returns `{ taskArn }` on success, or a failed result carrying RunTask
|
|
66
|
+
* `failures` details so the API can mark the work command/task as failed.
|
|
67
|
+
*/
|
|
68
|
+
async function ecsLaunch(p) {
|
|
69
|
+
const validated = validateLaunchPayload(p);
|
|
70
|
+
if (typeof validated === 'string') {
|
|
71
|
+
return (0, types_1.errorResult)(validated);
|
|
72
|
+
}
|
|
73
|
+
const region = (0, aws_arn_1.regionFromArn)(validated.clusterArn);
|
|
74
|
+
if (!region) {
|
|
75
|
+
return (0, types_1.errorResult)(`Could not determine region from clusterArn: ${validated.clusterArn}`);
|
|
76
|
+
}
|
|
77
|
+
// Do NOT log containerEnv — it carries AGENT_ONESHOT_TOKEN.
|
|
78
|
+
logger_1.logger.info(`[ecs] RunTask: taskDefinition=${validated.taskDefinitionArn} cluster=${validated.clusterArn}`);
|
|
79
|
+
try {
|
|
80
|
+
const client = new client_ecs_1.ECSClient({ region });
|
|
81
|
+
const response = await client.send(new client_ecs_1.RunTaskCommand({
|
|
82
|
+
cluster: validated.clusterArn,
|
|
83
|
+
taskDefinition: validated.taskDefinitionArn,
|
|
84
|
+
launchType: 'FARGATE',
|
|
85
|
+
count: 1,
|
|
86
|
+
networkConfiguration: {
|
|
87
|
+
awsvpcConfiguration: {
|
|
88
|
+
subnets: validated.subnetIds,
|
|
89
|
+
securityGroups: validated.securityGroupIds,
|
|
90
|
+
assignPublicIp: validated.assignPublicIp ? 'ENABLED' : 'DISABLED',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
overrides: {
|
|
94
|
+
containerOverrides: [
|
|
95
|
+
{
|
|
96
|
+
name: constants_1.ECS_AGENT_CONTAINER_NAME,
|
|
97
|
+
environment: Object.entries(validated.containerEnv).map(([name, value]) => ({ name, value })),
|
|
98
|
+
},
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
}));
|
|
102
|
+
if (response.failures && response.failures.length > 0) {
|
|
103
|
+
const reasons = response.failures
|
|
104
|
+
.map((f) => `${f.reason ?? 'unknown'}${f.detail ? ` (${f.detail})` : ''}`)
|
|
105
|
+
.join('; ');
|
|
106
|
+
logger_1.logger.error(`[ecs] RunTask failed: ${reasons}`);
|
|
107
|
+
return (0, types_1.errorResult)(`ECS RunTask failed: ${reasons}`, { failures: response.failures });
|
|
108
|
+
}
|
|
109
|
+
const taskArn = response.tasks?.[0]?.taskArn;
|
|
110
|
+
if (!taskArn) {
|
|
111
|
+
return (0, types_1.errorResult)('ECS RunTask returned no task');
|
|
112
|
+
}
|
|
113
|
+
logger_1.logger.success(`[ecs] Task started: ${taskArn}`);
|
|
114
|
+
return (0, types_1.successResult)({ taskArn });
|
|
115
|
+
}
|
|
116
|
+
catch (error) {
|
|
117
|
+
const message = (0, utils_1.getErrorMessage)(error);
|
|
118
|
+
logger_1.logger.error(`[ecs] RunTask error: ${message}`);
|
|
119
|
+
return (0, types_1.errorResult)(`ECS RunTask error: ${message}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Handle the `ecs_stop` command: best-effort StopTask (used by the API's
|
|
124
|
+
* timeout sweep to reclaim timed-out oneshot containers).
|
|
125
|
+
*/
|
|
126
|
+
async function ecsStop(p) {
|
|
127
|
+
const clusterArn = typeof p.clusterArn === 'string' && p.clusterArn ? p.clusterArn : null;
|
|
128
|
+
if (!clusterArn)
|
|
129
|
+
return (0, types_1.errorResult)('clusterArn is required for ecs_stop');
|
|
130
|
+
const taskArn = typeof p.taskArn === 'string' && p.taskArn ? p.taskArn : null;
|
|
131
|
+
if (!taskArn)
|
|
132
|
+
return (0, types_1.errorResult)('taskArn is required for ecs_stop');
|
|
133
|
+
const region = (0, aws_arn_1.regionFromArn)(clusterArn);
|
|
134
|
+
if (!region) {
|
|
135
|
+
return (0, types_1.errorResult)(`Could not determine region from clusterArn: ${clusterArn}`);
|
|
136
|
+
}
|
|
137
|
+
logger_1.logger.info(`[ecs] StopTask: ${taskArn}`);
|
|
138
|
+
try {
|
|
139
|
+
const client = new client_ecs_1.ECSClient({ region });
|
|
140
|
+
const response = await client.send(new client_ecs_1.StopTaskCommand({
|
|
141
|
+
cluster: clusterArn,
|
|
142
|
+
task: taskArn,
|
|
143
|
+
reason: 'Stopped by ai-support-agent launcher (timeout or cancel)',
|
|
144
|
+
}));
|
|
145
|
+
return (0, types_1.successResult)({
|
|
146
|
+
stopped: true,
|
|
147
|
+
taskArn,
|
|
148
|
+
lastStatus: response.task?.lastStatus,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
catch (error) {
|
|
152
|
+
const message = (0, utils_1.getErrorMessage)(error);
|
|
153
|
+
logger_1.logger.warn(`[ecs] StopTask failed (best-effort): ${message}`);
|
|
154
|
+
return (0, types_1.errorResult)(`ECS StopTask failed: ${message}`, { stopped: false, taskArn });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=ecs-launcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ecs-launcher.js","sourceRoot":"","sources":["../../src/ecs/ecs-launcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ecs_launch capability detection.
|
|
3
|
+
*
|
|
4
|
+
* A resident agent should only advertise the `ecs_launch` capability when it
|
|
5
|
+
* can actually perform ECS RunTask/StopTask — i.e. when AWS credentials are
|
|
6
|
+
* resolvable through the default provider chain (env vars, shared
|
|
7
|
+
* config/credentials files, SSO cache, IMDS/ECS metadata, ...). Advertising
|
|
8
|
+
* it unconditionally would let the API's automatic launcher selection pick an
|
|
9
|
+
* agent that cannot launch anything, making ECS dispatch fail unpredictably.
|
|
10
|
+
*
|
|
11
|
+
* Override (checked before detection):
|
|
12
|
+
* AI_SUPPORT_AGENT_ECS_LAUNCHER=true force-enable, skip detection
|
|
13
|
+
* AI_SUPPORT_AGENT_ECS_LAUNCHER=false force-disable, skip detection
|
|
14
|
+
*
|
|
15
|
+
* The detection result is cached for the process lifetime so the register
|
|
16
|
+
* retry loop does not re-probe the credential chain (IMDS/STS) on every
|
|
17
|
+
* attempt.
|
|
18
|
+
*/
|
|
19
|
+
/** Reset the positive-detection cache (tests only). */
|
|
20
|
+
export declare function resetEcsLauncherCapabilityCache(): void;
|
|
21
|
+
/**
|
|
22
|
+
* Decide whether this agent should advertise the `ecs_launch` capability.
|
|
23
|
+
* Returns true when credentials are resolvable or force-enabled via env.
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectEcsLauncherCapability(env?: NodeJS.ProcessEnv, timeoutMs?: number): Promise<boolean>;
|
|
26
|
+
//# sourceMappingURL=launcher-capability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"launcher-capability.d.ts","sourceRoot":"","sources":["../../src/ecs/launcher-capability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAeH,uDAAuD;AACvD,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD;AAuBD;;;GAGG;AACH,wBAAsB,2BAA2B,CAC/C,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,SAAS,GAAE,MAAuC,GACjD,OAAO,CAAC,OAAO,CAAC,CAyBlB"}
|
|
@@ -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
|
-
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,yCAAmC;AAEnC,iDAA2C;AAC3C,uDAA0D;AAC1D,iEAAmE;AACnE,2DAA+D;AAC/D,yDAA4D;AAC5D,gEAAyE;AACzE,gEAAmE;AACnE,+CAAiE;AACjE,iDAA6E;AAC7E,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/locales/en.json
CHANGED
|
@@ -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}})",
|
package/dist/locales/ja.json
CHANGED
|
@@ -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"}
|