Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5da7e4b
refactor: decouple TelemetryClient from command_run logic
Hweinstock May 14, 2026
ffbe31f
refactor: make withCommandRun internal, migrate consumers
Hweinstock May 14, 2026
992ad6d
feat: add typed metric registry, MetricName enforced at compile time
Hweinstock May 14, 2026
7a1ded1
docs: update telemetry README with new metric and new command guides
Hweinstock May 14, 2026
50e781d
fix: restore try/catch in recordCommandRun to prevent telemetry crashes
Hweinstock May 14, 2026
328e823
fix: tighten emit() type safety, use MetricName in sinks, rename mode…
Hweinstock May 14, 2026
6468ed7
simplify: derive registry types from COMMAND_SCHEMAS, remove manual C…
Hweinstock May 14, 2026
201185c
simplify: remove dead exports, Command z.enum, and fix deploy/utils d…
Hweinstock May 14, 2026
ab570dd
fix: remove dead CancelResult schema — no code path produces cancel e…
Hweinstock May 14, 2026
1021dc3
fix: rename stale mode→deploy_mode in useDeployFlow diff path
Hweinstock May 14, 2026
36f3c36
test: add coverage for callback-throws path in withCommandRunTelemetry
Hweinstock May 14, 2026
bed69e4
docs: rewrite telemetry README to match implementation
Hweinstock May 14, 2026
4f4c48f
fix: wrap no-client case in try-catch for consistency with other case
Hweinstock May 15, 2026
7702fce
docs: update outdated docstring
Hweinstock May 15, 2026
10d9e96
chore: rebase onto mainline
Hweinstock May 15, 2026
4a2b6ea
feat(telemetry): add MetricRegistry type with descriptions
Hweinstock May 16, 2026
8963e23
refactor: prefix relevant metric name
Hweinstock May 18, 2026
43cbf36
fix: update integ tests with new shapes
Hweinstock May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions integ-tests/create-edge-cases.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,7 +38,7 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'failure',
language: 'python',
agent_language: 'python',
has_agent: 'true',
});
});
Expand DownExpand Up@@ -142,8 +142,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'strands',
agent_language: 'python',
agent_framework: 'strands',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
4 changes: 2 additions & 2 deletions integ-tests/create-frameworks.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,8 +69,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with differen
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'langchain_langgraph',
agent_language: 'python',
agent_framework: 'langchain_langgraph',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
6 changes: 3 additions & 3 deletions integ-tests/dev-server.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -112,10 +112,10 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
ui_mode: 'terminal',
exit_reason: 'success',
protocol: 'http',
agent_protocol: 'http',
});

// Verify failure telemetry when invoking a non-running port
Expand All@@ -125,7 +125,7 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
exit_reason: 'failure',
});

Expand Down
20 changes: 10 additions & 10 deletions src/cli/commands/create/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,14 +11,14 @@ import { LIFECYCLE_TIMEOUT_MAX, LIFECYCLE_TIMEOUT_MIN } from '../../../schema';
import { getErrorMessage } from '../../errors';
import { runCliCommand } from '../../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -115,12 +115,12 @@ async function handleCreateCLI(options: CreateOptions): Promise<void> {
}

const knownAttrs = {
language: standardize(Language, options.language),
framework: standardize(Framework, options.framework),
agent_language: standardize(AgentLanguage, options.language),
agent_framework: standardize(AgentFramework, options.framework),
model_provider: standardize(ModelProviderEnum, options.modelProvider),
memory: standardize(Memory, options.memory ?? 'none'),
protocol: standardize(Protocol, options.protocol ?? 'http'),
build: standardize(Build, options.build ?? 'codezip'),
memory_type: standardize(MemoryType, options.memory ?? 'none'),
agent_protocol: standardize(AgentProtocol, options.protocol ?? 'http'),
build_type: standardize(TelemetryBuildType, options.build ?? 'codezip'),
agent_type: standardize(AgentType, options.type ?? 'create'),
network_mode: standardize(NetworkModeEnum, options.networkMode ?? 'public'),
has_agent: options.agent !== false,
Expand Down
6 changes: 3 additions & 3 deletions src/cli/commands/deploy/__tests__/utils.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 3,
policy_engine_count: 2,
policy_count: 3,
mode: 'diff',
deploy_mode: 'diff',
});
});

Expand All@@ -39,7 +39,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy',
deploy_mode: 'deploy',
});
});

Expand All@@ -49,6 +49,6 @@ describe('computeDeployAttrs', () => {

expect(attrs.runtime_count).toBe(1);
expect(attrs.memory_count).toBe(0);
expect(attrs.mode).toBe('dry-run');
expect(attrs.deploy_mode).toBe('dry-run');
});
});
7 changes: 3 additions & 4 deletions src/cli/commands/deploy/utils.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
import type { AgentCoreProjectSpec } from '../../../schema';

export type DeployMode = 'deploy' | 'dry-run' | 'diff';
import type { DeployMode } from '../../telemetry/schemas/common-shapes';

export const DEFAULT_DEPLOY_ATTRS = {
runtime_count: 0,
Expand All@@ -12,7 +11,7 @@ export const DEFAULT_DEPLOY_ATTRS = {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy' as DeployMode,
deploy_mode: 'deploy' as DeployMode,
};

export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, mode: DeployMode) {
Expand All@@ -28,6 +27,6 @@ export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, m
gateway_target_count: gateways.reduce((sum, g) => sum + (g.targets ?? []).length, 0),
policy_engine_count: policyEngines.length,
policy_count: policyEngines.reduce((sum, pe) => sum + (pe.policies ?? []).length, 0),
mode,
deploy_mode: mode,
};
}
41 changes: 21 additions & 20 deletions src/cli/commands/dev/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import {
import { OtelCollector, startOtelCollector } from '../../operations/dev/otel';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { FatalError } from '../../tui/components';
import { LayoutProvider } from '../../tui/context';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -214,10 +214,10 @@ export const registerDev = (program: Command) => {
const execResult = await withCommandRunTelemetry(
'dev',
{
action: 'exec' as const,
dev_action: 'exec' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -257,10 +257,10 @@ export const registerDev = (program: Command) => {
const invokeResult = await withCommandRunTelemetry(
'dev',
{
action: 'invoke' as const,
dev_action: 'invoke' as const,
ui_mode: 'terminal' as const,
has_stream: opts.stream ?? false,
protocol: standardize(Protocol, protocol.toLowerCase()),
agent_protocol: standardize(AgentProtocol, protocol.toLowerCase()),
invoke_count: 1,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -384,10 +384,10 @@ export const registerDev = (program: Command) => {
const devResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (config.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (config.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -443,10 +443,10 @@ export const registerDev = (program: Command) => {
const tuiResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -479,20 +479,21 @@ export const registerDev = (program: Command) => {
// Default: launch web UI in browser
// NOTE: Do not copy this pattern. runBrowserMode blocks forever (internal
// await new Promise(() => {})) so we cannot use withCommandRunTelemetry here.
// We emit telemetry eagerly before the blocking call. If startup fails, the
// error propagates to the outer catch. Prefer withCommandRunTelemetry for
// commands that return.
// We emit telemetry eagerly before the blocking call.
{
const client = await TelemetryClientAccessor.get().catch(() => undefined);
const devAttrs = {
action: 'server' as const,
ui_mode: 'browser' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
};
if (client) {
await client.withCommandRun('dev', () => devAttrs);
client.emit('cli.command_run', 0, {
command_group: 'dev',
command: 'dev',
exit_reason: 'success',
dev_action: 'server',
ui_mode: 'browser',
has_stream: false,
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
});
await client.flush();
}
await runBrowserMode({
workingDir,
Expand Down
12 changes: 5 additions & 7 deletions src/cli/commands/help/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import type { Command } from '@commander-js/extra-typings';

const MODES_HELP = `
Expand DownExpand Up@@ -43,22 +43,20 @@ export const registerHelp = (program: Command) => {
.command('help')
.description('Display help topics')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help', () => {
await withCommandRunTelemetry('help', {}, () => {
console.log('Available help topics: modes');
console.log('Run `agentcore help <topic>` for details.');
return {};
return { success: true as const };
});
});

helpCmd
.command('modes')
.description('Explain interactive vs non-interactive modes')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help.modes', () => {
await withCommandRunTelemetry('help.modes', {}, () => {
console.log(MODES_HELP);
return {};
return { success: true as const };
});
});
};
2 changes: 1 addition & 1 deletion src/cli/commands/invoke/__tests__/invoke.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -87,7 +87,7 @@ describe('invoke command', () => {
telemetry.assertMetricEmitted({
command: 'invoke',
exit_reason: 'failure',
protocol: 'http',
agent_protocol: 'http',
auth_type: 'sigv4',
has_session_id: false,
});
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/invoke/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { type Result, ValidationError, serializeResult } from '../../../lib';
import { getErrorMessage } from '../../errors';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { AuthType, Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, AuthType, standardize } from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
import { requireProject, requireTTY } from '../../tui/guards';
import { InvokeScreen } from '../../tui/screens/invoke';
Expand DownExpand Up@@ -190,8 +190,8 @@ export const registerInvoke = (program: Command) => {
has_stream: cliOptions.stream ?? false,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(
Protocol,
agent_protocol: standardize(
AgentProtocol,
resolveProtocol({ tool: cliOptions.tool } as InvokeOptions, agentProtocol)
),
},
Expand DownExpand Up@@ -247,7 +247,7 @@ export const registerInvoke = (program: Command) => {
has_stream: true,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(Protocol, resolveProtocol({}, agentProtocol)),
agent_protocol: standardize(AgentProtocol, resolveProtocol({}, agentProtocol)),
},
async (): Promise<Result> => {
const { waitUntilExit, unmount } = render(
Expand Down
20 changes: 10 additions & 10 deletions src/cli/primitives/AgentPrimitive.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,15 +48,15 @@ import { setupPythonProject } from '../operations/python';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
AuthorizerType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { createRenderer } from '../templates';
Expand DownExpand Up@@ -364,15 +364,15 @@ export class AgentPrimitive extends BasePrimitive<AddAgentOptions, RemovableReso
}

return {
language: standardize(Language, cliOptions.language),
framework: standardize(Framework, cliOptions.framework),
agent_language: standardize(AgentLanguage, cliOptions.language),
agent_framework: standardize(AgentFramework, cliOptions.framework),
model_provider: standardize(ModelProviderEnum, cliOptions.modelProvider),
agent_type: standardize(AgentType, cliOptions.type ?? 'create'),
build: standardize(Build, cliOptions.build ?? 'CodeZip'),
protocol: standardize(Protocol, cliOptions.protocol ?? 'HTTP'),
build_type: standardize(TelemetryBuildType, cliOptions.build ?? 'CodeZip'),
agent_protocol: standardize(AgentProtocol, cliOptions.protocol ?? 'HTTP'),
network_mode: standardize(NetworkModeEnum, cliOptions.networkMode ?? 'PUBLIC'),
authorizer_type: standardize(AuthorizerType, cliOptions.authorizerType ?? 'NONE'),
memory: standardize(Memory, cliOptions.memory ?? 'none'),
memory_type: standardize(MemoryType, cliOptions.memory ?? 'none'),
};
});
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/primitives/EvaluatorPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ import { EvaluationLevelSchema, EvaluatorSchema, isValidKmsKeyArn } from '../../
import { getErrorMessage } from '../errors';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import { EvaluatorType, Level, standardize } from '../telemetry/schemas/common-shapes.js';
import { EvaluatorLevel, EvaluatorType, standardize } from '../telemetry/schemas/common-shapes.js';
import { renderCodeBasedEvaluatorTemplate } from '../templates/EvaluatorRenderer';
import { requireTTY } from '../tui/guards/tty';
import {
Expand DownExpand Up@@ -329,7 +329,7 @@ export class EvaluatorPrimitive extends BasePrimitive<AddEvaluatorOptions, Remov

return {
evaluator_type: standardize(EvaluatorType, evalType),
level: standardize(Level, levelResult.data),
evaluator_level: standardize(EvaluatorLevel, levelResult.data),
};
});
} else {
Expand Down
10 changes: 5 additions & 5 deletions src/cli/primitives/GatewayTargetPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import { runCliCommand, withCommandRunTelemetry } from '../telemetry/cli-command
import {
GATEWAY_TARGET_TYPE_MAP,
GatewayTargetHost,
OutboundAuth,
OutboundAuthType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { getTemplateToolDefinitions, renderGatewayTargetTemplate } from '../templates/GatewayTargetRenderer';
Expand DownExpand Up@@ -337,14 +337,14 @@ export class GatewayTargetPrimitive extends BasePrimitive<AddGatewayTargetOption
const cliType = cliOptions.type ?? '';
const telemetryTargetType = GATEWAY_TARGET_TYPE_MAP[cliType] ?? ('unknown' as const);
const telemetryOutboundAuth = standardize(
OutboundAuth,
OutboundAuthType,
(cliOptions.outboundAuthType ?? 'none').replaceAll('_', '-')
);
const telemetryHost = standardize(GatewayTargetHost, cliOptions.host ?? 'lambda');
const telemetryAttrs = {
target_type: telemetryTargetType,
host: telemetryHost,
outbound_auth: telemetryOutboundAuth,
gateway_target_type: telemetryTargetType,
gateway_target_host: telemetryHost,
outbound_auth_type: telemetryOutboundAuth,
};

// Handle API Gateway targets (no code generation)
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5da7e4b
refactor: decouple TelemetryClient from command_run logic
Hweinstock May 14, 2026
ffbe31f
refactor: make withCommandRun internal, migrate consumers
Hweinstock May 14, 2026
992ad6d
feat: add typed metric registry, MetricName enforced at compile time
Hweinstock May 14, 2026
7a1ded1
docs: update telemetry README with new metric and new command guides
Hweinstock May 14, 2026
50e781d
fix: restore try/catch in recordCommandRun to prevent telemetry crashes
Hweinstock May 14, 2026
328e823
fix: tighten emit() type safety, use MetricName in sinks, rename mode…
Hweinstock May 14, 2026
6468ed7
simplify: derive registry types from COMMAND_SCHEMAS, remove manual C…
Hweinstock May 14, 2026
201185c
simplify: remove dead exports, Command z.enum, and fix deploy/utils d…
Hweinstock May 14, 2026
ab570dd
fix: remove dead CancelResult schema — no code path produces cancel e…
Hweinstock May 14, 2026
1021dc3
fix: rename stale mode→deploy_mode in useDeployFlow diff path
Hweinstock May 14, 2026
36f3c36
test: add coverage for callback-throws path in withCommandRunTelemetry
Hweinstock May 14, 2026
bed69e4
docs: rewrite telemetry README to match implementation
Hweinstock May 14, 2026
4f4c48f
fix: wrap no-client case in try-catch for consistency with other case
Hweinstock May 15, 2026
7702fce
docs: update outdated docstring
Hweinstock May 15, 2026
10d9e96
chore: rebase onto mainline
Hweinstock May 15, 2026
4a2b6ea
feat(telemetry): add MetricRegistry type with descriptions
Hweinstock May 16, 2026
8963e23
refactor: prefix relevant metric name
Hweinstock May 18, 2026
43cbf36
fix: update integ tests with new shapes
Hweinstock May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions integ-tests/create-edge-cases.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,7 +38,7 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'failure',
language: 'python',
agent_language: 'python',
has_agent: 'true',
});
});
Expand DownExpand Up@@ -142,8 +142,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'strands',
agent_language: 'python',
agent_framework: 'strands',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
4 changes: 2 additions & 2 deletions integ-tests/create-frameworks.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,8 +69,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with differen
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'langchain_langgraph',
agent_language: 'python',
agent_framework: 'langchain_langgraph',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
6 changes: 3 additions & 3 deletions integ-tests/dev-server.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -112,10 +112,10 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
ui_mode: 'terminal',
exit_reason: 'success',
protocol: 'http',
agent_protocol: 'http',
});

// Verify failure telemetry when invoking a non-running port
Expand All@@ -125,7 +125,7 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
exit_reason: 'failure',
});

Expand Down
20 changes: 10 additions & 10 deletions src/cli/commands/create/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,14 +11,14 @@ import { LIFECYCLE_TIMEOUT_MAX, LIFECYCLE_TIMEOUT_MIN } from '../../../schema';
import { getErrorMessage } from '../../errors';
import { runCliCommand } from '../../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -115,12 +115,12 @@ async function handleCreateCLI(options: CreateOptions): Promise<void> {
}

const knownAttrs = {
language: standardize(Language, options.language),
framework: standardize(Framework, options.framework),
agent_language: standardize(AgentLanguage, options.language),
agent_framework: standardize(AgentFramework, options.framework),
model_provider: standardize(ModelProviderEnum, options.modelProvider),
memory: standardize(Memory, options.memory ?? 'none'),
protocol: standardize(Protocol, options.protocol ?? 'http'),
build: standardize(Build, options.build ?? 'codezip'),
memory_type: standardize(MemoryType, options.memory ?? 'none'),
agent_protocol: standardize(AgentProtocol, options.protocol ?? 'http'),
build_type: standardize(TelemetryBuildType, options.build ?? 'codezip'),
agent_type: standardize(AgentType, options.type ?? 'create'),
network_mode: standardize(NetworkModeEnum, options.networkMode ?? 'public'),
has_agent: options.agent !== false,
Expand Down
6 changes: 3 additions & 3 deletions src/cli/commands/deploy/__tests__/utils.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 3,
policy_engine_count: 2,
policy_count: 3,
mode: 'diff',
deploy_mode: 'diff',
});
});

Expand All@@ -39,7 +39,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy',
deploy_mode: 'deploy',
});
});

Expand All@@ -49,6 +49,6 @@ describe('computeDeployAttrs', () => {

expect(attrs.runtime_count).toBe(1);
expect(attrs.memory_count).toBe(0);
expect(attrs.mode).toBe('dry-run');
expect(attrs.deploy_mode).toBe('dry-run');
});
});
7 changes: 3 additions & 4 deletions src/cli/commands/deploy/utils.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
import type { AgentCoreProjectSpec } from '../../../schema';

export type DeployMode = 'deploy' | 'dry-run' | 'diff';
import type { DeployMode } from '../../telemetry/schemas/common-shapes';

export const DEFAULT_DEPLOY_ATTRS = {
runtime_count: 0,
Expand All@@ -12,7 +11,7 @@ export const DEFAULT_DEPLOY_ATTRS = {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy' as DeployMode,
deploy_mode: 'deploy' as DeployMode,
};

export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, mode: DeployMode) {
Expand All@@ -28,6 +27,6 @@ export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, m
gateway_target_count: gateways.reduce((sum, g) => sum + (g.targets ?? []).length, 0),
policy_engine_count: policyEngines.length,
policy_count: policyEngines.reduce((sum, pe) => sum + (pe.policies ?? []).length, 0),
mode,
deploy_mode: mode,
};
}
41 changes: 21 additions & 20 deletions src/cli/commands/dev/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import {
import { OtelCollector, startOtelCollector } from '../../operations/dev/otel';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { FatalError } from '../../tui/components';
import { LayoutProvider } from '../../tui/context';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -214,10 +214,10 @@ export const registerDev = (program: Command) => {
const execResult = await withCommandRunTelemetry(
'dev',
{
action: 'exec' as const,
dev_action: 'exec' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -257,10 +257,10 @@ export const registerDev = (program: Command) => {
const invokeResult = await withCommandRunTelemetry(
'dev',
{
action: 'invoke' as const,
dev_action: 'invoke' as const,
ui_mode: 'terminal' as const,
has_stream: opts.stream ?? false,
protocol: standardize(Protocol, protocol.toLowerCase()),
agent_protocol: standardize(AgentProtocol, protocol.toLowerCase()),
invoke_count: 1,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -384,10 +384,10 @@ export const registerDev = (program: Command) => {
const devResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (config.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (config.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -443,10 +443,10 @@ export const registerDev = (program: Command) => {
const tuiResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -479,20 +479,21 @@ export const registerDev = (program: Command) => {
// Default: launch web UI in browser
// NOTE: Do not copy this pattern. runBrowserMode blocks forever (internal
// await new Promise(() => {})) so we cannot use withCommandRunTelemetry here.
// We emit telemetry eagerly before the blocking call. If startup fails, the
// error propagates to the outer catch. Prefer withCommandRunTelemetry for
// commands that return.
// We emit telemetry eagerly before the blocking call.
{
const client = await TelemetryClientAccessor.get().catch(() => undefined);
const devAttrs = {
action: 'server' as const,
ui_mode: 'browser' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
};
if (client) {
await client.withCommandRun('dev', () => devAttrs);
client.emit('cli.command_run', 0, {
command_group: 'dev',
command: 'dev',
exit_reason: 'success',
dev_action: 'server',
ui_mode: 'browser',
has_stream: false,
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
});
await client.flush();
}
await runBrowserMode({
workingDir,
Expand Down
12 changes: 5 additions & 7 deletions src/cli/commands/help/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import type { Command } from '@commander-js/extra-typings';

const MODES_HELP = `
Expand DownExpand Up@@ -43,22 +43,20 @@ export const registerHelp = (program: Command) => {
.command('help')
.description('Display help topics')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help', () => {
await withCommandRunTelemetry('help', {}, () => {
console.log('Available help topics: modes');
console.log('Run `agentcore help <topic>` for details.');
return {};
return { success: true as const };
});
});

helpCmd
.command('modes')
.description('Explain interactive vs non-interactive modes')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help.modes', () => {
await withCommandRunTelemetry('help.modes', {}, () => {
console.log(MODES_HELP);
return {};
return { success: true as const };
});
});
};
2 changes: 1 addition & 1 deletion src/cli/commands/invoke/__tests__/invoke.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -87,7 +87,7 @@ describe('invoke command', () => {
telemetry.assertMetricEmitted({
command: 'invoke',
exit_reason: 'failure',
protocol: 'http',
agent_protocol: 'http',
auth_type: 'sigv4',
has_session_id: false,
});
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/invoke/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { type Result, ValidationError, serializeResult } from '../../../lib';
import { getErrorMessage } from '../../errors';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { AuthType, Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, AuthType, standardize } from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
import { requireProject, requireTTY } from '../../tui/guards';
import { InvokeScreen } from '../../tui/screens/invoke';
Expand DownExpand Up@@ -190,8 +190,8 @@ export const registerInvoke = (program: Command) => {
has_stream: cliOptions.stream ?? false,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(
Protocol,
agent_protocol: standardize(
AgentProtocol,
resolveProtocol({ tool: cliOptions.tool } as InvokeOptions, agentProtocol)
),
},
Expand DownExpand Up@@ -247,7 +247,7 @@ export const registerInvoke = (program: Command) => {
has_stream: true,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(Protocol, resolveProtocol({}, agentProtocol)),
agent_protocol: standardize(AgentProtocol, resolveProtocol({}, agentProtocol)),
},
async (): Promise<Result> => {
const { waitUntilExit, unmount } = render(
Expand Down
20 changes: 10 additions & 10 deletions src/cli/primitives/AgentPrimitive.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,15 +48,15 @@ import { setupPythonProject } from '../operations/python';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
AuthorizerType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { createRenderer } from '../templates';
Expand DownExpand Up@@ -364,15 +364,15 @@ export class AgentPrimitive extends BasePrimitive<AddAgentOptions, RemovableReso
}

return {
language: standardize(Language, cliOptions.language),
framework: standardize(Framework, cliOptions.framework),
agent_language: standardize(AgentLanguage, cliOptions.language),
agent_framework: standardize(AgentFramework, cliOptions.framework),
model_provider: standardize(ModelProviderEnum, cliOptions.modelProvider),
agent_type: standardize(AgentType, cliOptions.type ?? 'create'),
build: standardize(Build, cliOptions.build ?? 'CodeZip'),
protocol: standardize(Protocol, cliOptions.protocol ?? 'HTTP'),
build_type: standardize(TelemetryBuildType, cliOptions.build ?? 'CodeZip'),
agent_protocol: standardize(AgentProtocol, cliOptions.protocol ?? 'HTTP'),
network_mode: standardize(NetworkModeEnum, cliOptions.networkMode ?? 'PUBLIC'),
authorizer_type: standardize(AuthorizerType, cliOptions.authorizerType ?? 'NONE'),
memory: standardize(Memory, cliOptions.memory ?? 'none'),
memory_type: standardize(MemoryType, cliOptions.memory ?? 'none'),
};
});
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/primitives/EvaluatorPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ import { EvaluationLevelSchema, EvaluatorSchema, isValidKmsKeyArn } from '../../
import { getErrorMessage } from '../errors';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import { EvaluatorType, Level, standardize } from '../telemetry/schemas/common-shapes.js';
import { EvaluatorLevel, EvaluatorType, standardize } from '../telemetry/schemas/common-shapes.js';
import { renderCodeBasedEvaluatorTemplate } from '../templates/EvaluatorRenderer';
import { requireTTY } from '../tui/guards/tty';
import {
Expand DownExpand Up@@ -329,7 +329,7 @@ export class EvaluatorPrimitive extends BasePrimitive<AddEvaluatorOptions, Remov

return {
evaluator_type: standardize(EvaluatorType, evalType),
level: standardize(Level, levelResult.data),
evaluator_level: standardize(EvaluatorLevel, levelResult.data),
};
});
} else {
Expand Down
10 changes: 5 additions & 5 deletions src/cli/primitives/GatewayTargetPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import { runCliCommand, withCommandRunTelemetry } from '../telemetry/cli-command
import {
GATEWAY_TARGET_TYPE_MAP,
GatewayTargetHost,
OutboundAuth,
OutboundAuthType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { getTemplateToolDefinitions, renderGatewayTargetTemplate } from '../templates/GatewayTargetRenderer';
Expand DownExpand Up@@ -337,14 +337,14 @@ export class GatewayTargetPrimitive extends BasePrimitive<AddGatewayTargetOption
const cliType = cliOptions.type ?? '';
const telemetryTargetType = GATEWAY_TARGET_TYPE_MAP[cliType] ?? ('unknown' as const);
const telemetryOutboundAuth = standardize(
OutboundAuth,
OutboundAuthType,
(cliOptions.outboundAuthType ?? 'none').replaceAll('_', '-')
);
const telemetryHost = standardize(GatewayTargetHost, cliOptions.host ?? 'lambda');
const telemetryAttrs = {
target_type: telemetryTargetType,
host: telemetryHost,
outbound_auth: telemetryOutboundAuth,
gateway_target_type: telemetryTargetType,
gateway_target_host: telemetryHost,
outbound_auth_type: telemetryOutboundAuth,
};

// Handle API Gateway targets (no code generation)
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5da7e4b
refactor: decouple TelemetryClient from command_run logic
Hweinstock May 14, 2026
ffbe31f
refactor: make withCommandRun internal, migrate consumers
Hweinstock May 14, 2026
992ad6d
feat: add typed metric registry, MetricName enforced at compile time
Hweinstock May 14, 2026
7a1ded1
docs: update telemetry README with new metric and new command guides
Hweinstock May 14, 2026
50e781d
fix: restore try/catch in recordCommandRun to prevent telemetry crashes
Hweinstock May 14, 2026
328e823
fix: tighten emit() type safety, use MetricName in sinks, rename mode…
Hweinstock May 14, 2026
6468ed7
simplify: derive registry types from COMMAND_SCHEMAS, remove manual C…
Hweinstock May 14, 2026
201185c
simplify: remove dead exports, Command z.enum, and fix deploy/utils d…
Hweinstock May 14, 2026
ab570dd
fix: remove dead CancelResult schema — no code path produces cancel e…
Hweinstock May 14, 2026
1021dc3
fix: rename stale mode→deploy_mode in useDeployFlow diff path
Hweinstock May 14, 2026
36f3c36
test: add coverage for callback-throws path in withCommandRunTelemetry
Hweinstock May 14, 2026
bed69e4
docs: rewrite telemetry README to match implementation
Hweinstock May 14, 2026
4f4c48f
fix: wrap no-client case in try-catch for consistency with other case
Hweinstock May 15, 2026
7702fce
docs: update outdated docstring
Hweinstock May 15, 2026
10d9e96
chore: rebase onto mainline
Hweinstock May 15, 2026
4a2b6ea
feat(telemetry): add MetricRegistry type with descriptions
Hweinstock May 16, 2026
8963e23
refactor: prefix relevant metric name
Hweinstock May 18, 2026
43cbf36
fix: update integ tests with new shapes
Hweinstock May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions integ-tests/create-edge-cases.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,7 +38,7 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'failure',
language: 'python',
agent_language: 'python',
has_agent: 'true',
});
});
Expand DownExpand Up@@ -142,8 +142,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'strands',
agent_language: 'python',
agent_framework: 'strands',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
4 changes: 2 additions & 2 deletions integ-tests/create-frameworks.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,8 +69,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with differen
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'langchain_langgraph',
agent_language: 'python',
agent_framework: 'langchain_langgraph',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
6 changes: 3 additions & 3 deletions integ-tests/dev-server.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -112,10 +112,10 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
ui_mode: 'terminal',
exit_reason: 'success',
protocol: 'http',
agent_protocol: 'http',
});

// Verify failure telemetry when invoking a non-running port
Expand All@@ -125,7 +125,7 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
exit_reason: 'failure',
});

Expand Down
20 changes: 10 additions & 10 deletions src/cli/commands/create/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,14 +11,14 @@ import { LIFECYCLE_TIMEOUT_MAX, LIFECYCLE_TIMEOUT_MIN } from '../../../schema';
import { getErrorMessage } from '../../errors';
import { runCliCommand } from '../../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -115,12 +115,12 @@ async function handleCreateCLI(options: CreateOptions): Promise<void> {
}

const knownAttrs = {
language: standardize(Language, options.language),
framework: standardize(Framework, options.framework),
agent_language: standardize(AgentLanguage, options.language),
agent_framework: standardize(AgentFramework, options.framework),
model_provider: standardize(ModelProviderEnum, options.modelProvider),
memory: standardize(Memory, options.memory ?? 'none'),
protocol: standardize(Protocol, options.protocol ?? 'http'),
build: standardize(Build, options.build ?? 'codezip'),
memory_type: standardize(MemoryType, options.memory ?? 'none'),
agent_protocol: standardize(AgentProtocol, options.protocol ?? 'http'),
build_type: standardize(TelemetryBuildType, options.build ?? 'codezip'),
agent_type: standardize(AgentType, options.type ?? 'create'),
network_mode: standardize(NetworkModeEnum, options.networkMode ?? 'public'),
has_agent: options.agent !== false,
Expand Down
6 changes: 3 additions & 3 deletions src/cli/commands/deploy/__tests__/utils.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 3,
policy_engine_count: 2,
policy_count: 3,
mode: 'diff',
deploy_mode: 'diff',
});
});

Expand All@@ -39,7 +39,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy',
deploy_mode: 'deploy',
});
});

Expand All@@ -49,6 +49,6 @@ describe('computeDeployAttrs', () => {

expect(attrs.runtime_count).toBe(1);
expect(attrs.memory_count).toBe(0);
expect(attrs.mode).toBe('dry-run');
expect(attrs.deploy_mode).toBe('dry-run');
});
});
7 changes: 3 additions & 4 deletions src/cli/commands/deploy/utils.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
import type { AgentCoreProjectSpec } from '../../../schema';

export type DeployMode = 'deploy' | 'dry-run' | 'diff';
import type { DeployMode } from '../../telemetry/schemas/common-shapes';

export const DEFAULT_DEPLOY_ATTRS = {
runtime_count: 0,
Expand All@@ -12,7 +11,7 @@ export const DEFAULT_DEPLOY_ATTRS = {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy' as DeployMode,
deploy_mode: 'deploy' as DeployMode,
};

export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, mode: DeployMode) {
Expand All@@ -28,6 +27,6 @@ export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, m
gateway_target_count: gateways.reduce((sum, g) => sum + (g.targets ?? []).length, 0),
policy_engine_count: policyEngines.length,
policy_count: policyEngines.reduce((sum, pe) => sum + (pe.policies ?? []).length, 0),
mode,
deploy_mode: mode,
};
}
41 changes: 21 additions & 20 deletions src/cli/commands/dev/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import {
import { OtelCollector, startOtelCollector } from '../../operations/dev/otel';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { FatalError } from '../../tui/components';
import { LayoutProvider } from '../../tui/context';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -214,10 +214,10 @@ export const registerDev = (program: Command) => {
const execResult = await withCommandRunTelemetry(
'dev',
{
action: 'exec' as const,
dev_action: 'exec' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -257,10 +257,10 @@ export const registerDev = (program: Command) => {
const invokeResult = await withCommandRunTelemetry(
'dev',
{
action: 'invoke' as const,
dev_action: 'invoke' as const,
ui_mode: 'terminal' as const,
has_stream: opts.stream ?? false,
protocol: standardize(Protocol, protocol.toLowerCase()),
agent_protocol: standardize(AgentProtocol, protocol.toLowerCase()),
invoke_count: 1,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -384,10 +384,10 @@ export const registerDev = (program: Command) => {
const devResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (config.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (config.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -443,10 +443,10 @@ export const registerDev = (program: Command) => {
const tuiResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -479,20 +479,21 @@ export const registerDev = (program: Command) => {
// Default: launch web UI in browser
// NOTE: Do not copy this pattern. runBrowserMode blocks forever (internal
// await new Promise(() => {})) so we cannot use withCommandRunTelemetry here.
// We emit telemetry eagerly before the blocking call. If startup fails, the
// error propagates to the outer catch. Prefer withCommandRunTelemetry for
// commands that return.
// We emit telemetry eagerly before the blocking call.
{
const client = await TelemetryClientAccessor.get().catch(() => undefined);
const devAttrs = {
action: 'server' as const,
ui_mode: 'browser' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
};
if (client) {
await client.withCommandRun('dev', () => devAttrs);
client.emit('cli.command_run', 0, {
command_group: 'dev',
command: 'dev',
exit_reason: 'success',
dev_action: 'server',
ui_mode: 'browser',
has_stream: false,
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
});
await client.flush();
}
await runBrowserMode({
workingDir,
Expand Down
12 changes: 5 additions & 7 deletions src/cli/commands/help/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import type { Command } from '@commander-js/extra-typings';

const MODES_HELP = `
Expand DownExpand Up@@ -43,22 +43,20 @@ export const registerHelp = (program: Command) => {
.command('help')
.description('Display help topics')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help', () => {
await withCommandRunTelemetry('help', {}, () => {
console.log('Available help topics: modes');
console.log('Run `agentcore help <topic>` for details.');
return {};
return { success: true as const };
});
});

helpCmd
.command('modes')
.description('Explain interactive vs non-interactive modes')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help.modes', () => {
await withCommandRunTelemetry('help.modes', {}, () => {
console.log(MODES_HELP);
return {};
return { success: true as const };
});
});
};
2 changes: 1 addition & 1 deletion src/cli/commands/invoke/__tests__/invoke.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -87,7 +87,7 @@ describe('invoke command', () => {
telemetry.assertMetricEmitted({
command: 'invoke',
exit_reason: 'failure',
protocol: 'http',
agent_protocol: 'http',
auth_type: 'sigv4',
has_session_id: false,
});
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/invoke/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { type Result, ValidationError, serializeResult } from '../../../lib';
import { getErrorMessage } from '../../errors';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { AuthType, Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, AuthType, standardize } from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
import { requireProject, requireTTY } from '../../tui/guards';
import { InvokeScreen } from '../../tui/screens/invoke';
Expand DownExpand Up@@ -190,8 +190,8 @@ export const registerInvoke = (program: Command) => {
has_stream: cliOptions.stream ?? false,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(
Protocol,
agent_protocol: standardize(
AgentProtocol,
resolveProtocol({ tool: cliOptions.tool } as InvokeOptions, agentProtocol)
),
},
Expand DownExpand Up@@ -247,7 +247,7 @@ export const registerInvoke = (program: Command) => {
has_stream: true,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(Protocol, resolveProtocol({}, agentProtocol)),
agent_protocol: standardize(AgentProtocol, resolveProtocol({}, agentProtocol)),
},
async (): Promise<Result> => {
const { waitUntilExit, unmount } = render(
Expand Down
20 changes: 10 additions & 10 deletions src/cli/primitives/AgentPrimitive.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,15 +48,15 @@ import { setupPythonProject } from '../operations/python';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
AuthorizerType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { createRenderer } from '../templates';
Expand DownExpand Up@@ -364,15 +364,15 @@ export class AgentPrimitive extends BasePrimitive<AddAgentOptions, RemovableReso
}

return {
language: standardize(Language, cliOptions.language),
framework: standardize(Framework, cliOptions.framework),
agent_language: standardize(AgentLanguage, cliOptions.language),
agent_framework: standardize(AgentFramework, cliOptions.framework),
model_provider: standardize(ModelProviderEnum, cliOptions.modelProvider),
agent_type: standardize(AgentType, cliOptions.type ?? 'create'),
build: standardize(Build, cliOptions.build ?? 'CodeZip'),
protocol: standardize(Protocol, cliOptions.protocol ?? 'HTTP'),
build_type: standardize(TelemetryBuildType, cliOptions.build ?? 'CodeZip'),
agent_protocol: standardize(AgentProtocol, cliOptions.protocol ?? 'HTTP'),
network_mode: standardize(NetworkModeEnum, cliOptions.networkMode ?? 'PUBLIC'),
authorizer_type: standardize(AuthorizerType, cliOptions.authorizerType ?? 'NONE'),
memory: standardize(Memory, cliOptions.memory ?? 'none'),
memory_type: standardize(MemoryType, cliOptions.memory ?? 'none'),
};
});
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/primitives/EvaluatorPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ import { EvaluationLevelSchema, EvaluatorSchema, isValidKmsKeyArn } from '../../
import { getErrorMessage } from '../errors';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import { EvaluatorType, Level, standardize } from '../telemetry/schemas/common-shapes.js';
import { EvaluatorLevel, EvaluatorType, standardize } from '../telemetry/schemas/common-shapes.js';
import { renderCodeBasedEvaluatorTemplate } from '../templates/EvaluatorRenderer';
import { requireTTY } from '../tui/guards/tty';
import {
Expand DownExpand Up@@ -329,7 +329,7 @@ export class EvaluatorPrimitive extends BasePrimitive<AddEvaluatorOptions, Remov

return {
evaluator_type: standardize(EvaluatorType, evalType),
level: standardize(Level, levelResult.data),
evaluator_level: standardize(EvaluatorLevel, levelResult.data),
};
});
} else {
Expand Down
10 changes: 5 additions & 5 deletions src/cli/primitives/GatewayTargetPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import { runCliCommand, withCommandRunTelemetry } from '../telemetry/cli-command
import {
GATEWAY_TARGET_TYPE_MAP,
GatewayTargetHost,
OutboundAuth,
OutboundAuthType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { getTemplateToolDefinitions, renderGatewayTargetTemplate } from '../templates/GatewayTargetRenderer';
Expand DownExpand Up@@ -337,14 +337,14 @@ export class GatewayTargetPrimitive extends BasePrimitive<AddGatewayTargetOption
const cliType = cliOptions.type ?? '';
const telemetryTargetType = GATEWAY_TARGET_TYPE_MAP[cliType] ?? ('unknown' as const);
const telemetryOutboundAuth = standardize(
OutboundAuth,
OutboundAuthType,
(cliOptions.outboundAuthType ?? 'none').replaceAll('_', '-')
);
const telemetryHost = standardize(GatewayTargetHost, cliOptions.host ?? 'lambda');
const telemetryAttrs = {
target_type: telemetryTargetType,
host: telemetryHost,
outbound_auth: telemetryOutboundAuth,
gateway_target_type: telemetryTargetType,
gateway_target_host: telemetryHost,
outbound_auth_type: telemetryOutboundAuth,
};

// Handle API Gateway targets (no code generation)
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5da7e4b
refactor: decouple TelemetryClient from command_run logic
Hweinstock May 14, 2026
ffbe31f
refactor: make withCommandRun internal, migrate consumers
Hweinstock May 14, 2026
992ad6d
feat: add typed metric registry, MetricName enforced at compile time
Hweinstock May 14, 2026
7a1ded1
docs: update telemetry README with new metric and new command guides
Hweinstock May 14, 2026
50e781d
fix: restore try/catch in recordCommandRun to prevent telemetry crashes
Hweinstock May 14, 2026
328e823
fix: tighten emit() type safety, use MetricName in sinks, rename mode…
Hweinstock May 14, 2026
6468ed7
simplify: derive registry types from COMMAND_SCHEMAS, remove manual C…
Hweinstock May 14, 2026
201185c
simplify: remove dead exports, Command z.enum, and fix deploy/utils d…
Hweinstock May 14, 2026
ab570dd
fix: remove dead CancelResult schema — no code path produces cancel e…
Hweinstock May 14, 2026
1021dc3
fix: rename stale mode→deploy_mode in useDeployFlow diff path
Hweinstock May 14, 2026
36f3c36
test: add coverage for callback-throws path in withCommandRunTelemetry
Hweinstock May 14, 2026
bed69e4
docs: rewrite telemetry README to match implementation
Hweinstock May 14, 2026
4f4c48f
fix: wrap no-client case in try-catch for consistency with other case
Hweinstock May 15, 2026
7702fce
docs: update outdated docstring
Hweinstock May 15, 2026
10d9e96
chore: rebase onto mainline
Hweinstock May 15, 2026
4a2b6ea
feat(telemetry): add MetricRegistry type with descriptions
Hweinstock May 16, 2026
8963e23
refactor: prefix relevant metric name
Hweinstock May 18, 2026
43cbf36
fix: update integ tests with new shapes
Hweinstock May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions integ-tests/create-edge-cases.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,7 +38,7 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'failure',
language: 'python',
agent_language: 'python',
has_agent: 'true',
});
});
Expand DownExpand Up@@ -142,8 +142,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'strands',
agent_language: 'python',
agent_framework: 'strands',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
4 changes: 2 additions & 2 deletions integ-tests/create-frameworks.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,8 +69,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with differen
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'langchain_langgraph',
agent_language: 'python',
agent_framework: 'langchain_langgraph',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
6 changes: 3 additions & 3 deletions integ-tests/dev-server.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -112,10 +112,10 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
ui_mode: 'terminal',
exit_reason: 'success',
protocol: 'http',
agent_protocol: 'http',
});

// Verify failure telemetry when invoking a non-running port
Expand All@@ -125,7 +125,7 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
exit_reason: 'failure',
});

Expand Down
20 changes: 10 additions & 10 deletions src/cli/commands/create/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,14 +11,14 @@ import { LIFECYCLE_TIMEOUT_MAX, LIFECYCLE_TIMEOUT_MIN } from '../../../schema';
import { getErrorMessage } from '../../errors';
import { runCliCommand } from '../../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -115,12 +115,12 @@ async function handleCreateCLI(options: CreateOptions): Promise<void> {
}

const knownAttrs = {
language: standardize(Language, options.language),
framework: standardize(Framework, options.framework),
agent_language: standardize(AgentLanguage, options.language),
agent_framework: standardize(AgentFramework, options.framework),
model_provider: standardize(ModelProviderEnum, options.modelProvider),
memory: standardize(Memory, options.memory ?? 'none'),
protocol: standardize(Protocol, options.protocol ?? 'http'),
build: standardize(Build, options.build ?? 'codezip'),
memory_type: standardize(MemoryType, options.memory ?? 'none'),
agent_protocol: standardize(AgentProtocol, options.protocol ?? 'http'),
build_type: standardize(TelemetryBuildType, options.build ?? 'codezip'),
agent_type: standardize(AgentType, options.type ?? 'create'),
network_mode: standardize(NetworkModeEnum, options.networkMode ?? 'public'),
has_agent: options.agent !== false,
Expand Down
6 changes: 3 additions & 3 deletions src/cli/commands/deploy/__tests__/utils.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 3,
policy_engine_count: 2,
policy_count: 3,
mode: 'diff',
deploy_mode: 'diff',
});
});

Expand All@@ -39,7 +39,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy',
deploy_mode: 'deploy',
});
});

Expand All@@ -49,6 +49,6 @@ describe('computeDeployAttrs', () => {

expect(attrs.runtime_count).toBe(1);
expect(attrs.memory_count).toBe(0);
expect(attrs.mode).toBe('dry-run');
expect(attrs.deploy_mode).toBe('dry-run');
});
});
7 changes: 3 additions & 4 deletions src/cli/commands/deploy/utils.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
import type { AgentCoreProjectSpec } from '../../../schema';

export type DeployMode = 'deploy' | 'dry-run' | 'diff';
import type { DeployMode } from '../../telemetry/schemas/common-shapes';

export const DEFAULT_DEPLOY_ATTRS = {
runtime_count: 0,
Expand All@@ -12,7 +11,7 @@ export const DEFAULT_DEPLOY_ATTRS = {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy' as DeployMode,
deploy_mode: 'deploy' as DeployMode,
};

export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, mode: DeployMode) {
Expand All@@ -28,6 +27,6 @@ export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, m
gateway_target_count: gateways.reduce((sum, g) => sum + (g.targets ?? []).length, 0),
policy_engine_count: policyEngines.length,
policy_count: policyEngines.reduce((sum, pe) => sum + (pe.policies ?? []).length, 0),
mode,
deploy_mode: mode,
};
}
41 changes: 21 additions & 20 deletions src/cli/commands/dev/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import {
import { OtelCollector, startOtelCollector } from '../../operations/dev/otel';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { FatalError } from '../../tui/components';
import { LayoutProvider } from '../../tui/context';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -214,10 +214,10 @@ export const registerDev = (program: Command) => {
const execResult = await withCommandRunTelemetry(
'dev',
{
action: 'exec' as const,
dev_action: 'exec' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -257,10 +257,10 @@ export const registerDev = (program: Command) => {
const invokeResult = await withCommandRunTelemetry(
'dev',
{
action: 'invoke' as const,
dev_action: 'invoke' as const,
ui_mode: 'terminal' as const,
has_stream: opts.stream ?? false,
protocol: standardize(Protocol, protocol.toLowerCase()),
agent_protocol: standardize(AgentProtocol, protocol.toLowerCase()),
invoke_count: 1,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -384,10 +384,10 @@ export const registerDev = (program: Command) => {
const devResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (config.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (config.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -443,10 +443,10 @@ export const registerDev = (program: Command) => {
const tuiResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -479,20 +479,21 @@ export const registerDev = (program: Command) => {
// Default: launch web UI in browser
// NOTE: Do not copy this pattern. runBrowserMode blocks forever (internal
// await new Promise(() => {})) so we cannot use withCommandRunTelemetry here.
// We emit telemetry eagerly before the blocking call. If startup fails, the
// error propagates to the outer catch. Prefer withCommandRunTelemetry for
// commands that return.
// We emit telemetry eagerly before the blocking call.
{
const client = await TelemetryClientAccessor.get().catch(() => undefined);
const devAttrs = {
action: 'server' as const,
ui_mode: 'browser' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
};
if (client) {
await client.withCommandRun('dev', () => devAttrs);
client.emit('cli.command_run', 0, {
command_group: 'dev',
command: 'dev',
exit_reason: 'success',
dev_action: 'server',
ui_mode: 'browser',
has_stream: false,
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
});
await client.flush();
}
await runBrowserMode({
workingDir,
Expand Down
12 changes: 5 additions & 7 deletions src/cli/commands/help/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import type { Command } from '@commander-js/extra-typings';

const MODES_HELP = `
Expand DownExpand Up@@ -43,22 +43,20 @@ export const registerHelp = (program: Command) => {
.command('help')
.description('Display help topics')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help', () => {
await withCommandRunTelemetry('help', {}, () => {
console.log('Available help topics: modes');
console.log('Run `agentcore help <topic>` for details.');
return {};
return { success: true as const };
});
});

helpCmd
.command('modes')
.description('Explain interactive vs non-interactive modes')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help.modes', () => {
await withCommandRunTelemetry('help.modes', {}, () => {
console.log(MODES_HELP);
return {};
return { success: true as const };
});
});
};
2 changes: 1 addition & 1 deletion src/cli/commands/invoke/__tests__/invoke.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -87,7 +87,7 @@ describe('invoke command', () => {
telemetry.assertMetricEmitted({
command: 'invoke',
exit_reason: 'failure',
protocol: 'http',
agent_protocol: 'http',
auth_type: 'sigv4',
has_session_id: false,
});
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/invoke/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { type Result, ValidationError, serializeResult } from '../../../lib';
import { getErrorMessage } from '../../errors';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { AuthType, Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, AuthType, standardize } from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
import { requireProject, requireTTY } from '../../tui/guards';
import { InvokeScreen } from '../../tui/screens/invoke';
Expand DownExpand Up@@ -190,8 +190,8 @@ export const registerInvoke = (program: Command) => {
has_stream: cliOptions.stream ?? false,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(
Protocol,
agent_protocol: standardize(
AgentProtocol,
resolveProtocol({ tool: cliOptions.tool } as InvokeOptions, agentProtocol)
),
},
Expand DownExpand Up@@ -247,7 +247,7 @@ export const registerInvoke = (program: Command) => {
has_stream: true,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(Protocol, resolveProtocol({}, agentProtocol)),
agent_protocol: standardize(AgentProtocol, resolveProtocol({}, agentProtocol)),
},
async (): Promise<Result> => {
const { waitUntilExit, unmount } = render(
Expand Down
20 changes: 10 additions & 10 deletions src/cli/primitives/AgentPrimitive.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,15 +48,15 @@ import { setupPythonProject } from '../operations/python';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
AuthorizerType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { createRenderer } from '../templates';
Expand DownExpand Up@@ -364,15 +364,15 @@ export class AgentPrimitive extends BasePrimitive<AddAgentOptions, RemovableReso
}

return {
language: standardize(Language, cliOptions.language),
framework: standardize(Framework, cliOptions.framework),
agent_language: standardize(AgentLanguage, cliOptions.language),
agent_framework: standardize(AgentFramework, cliOptions.framework),
model_provider: standardize(ModelProviderEnum, cliOptions.modelProvider),
agent_type: standardize(AgentType, cliOptions.type ?? 'create'),
build: standardize(Build, cliOptions.build ?? 'CodeZip'),
protocol: standardize(Protocol, cliOptions.protocol ?? 'HTTP'),
build_type: standardize(TelemetryBuildType, cliOptions.build ?? 'CodeZip'),
agent_protocol: standardize(AgentProtocol, cliOptions.protocol ?? 'HTTP'),
network_mode: standardize(NetworkModeEnum, cliOptions.networkMode ?? 'PUBLIC'),
authorizer_type: standardize(AuthorizerType, cliOptions.authorizerType ?? 'NONE'),
memory: standardize(Memory, cliOptions.memory ?? 'none'),
memory_type: standardize(MemoryType, cliOptions.memory ?? 'none'),
};
});
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/primitives/EvaluatorPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ import { EvaluationLevelSchema, EvaluatorSchema, isValidKmsKeyArn } from '../../
import { getErrorMessage } from '../errors';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import { EvaluatorType, Level, standardize } from '../telemetry/schemas/common-shapes.js';
import { EvaluatorLevel, EvaluatorType, standardize } from '../telemetry/schemas/common-shapes.js';
import { renderCodeBasedEvaluatorTemplate } from '../templates/EvaluatorRenderer';
import { requireTTY } from '../tui/guards/tty';
import {
Expand DownExpand Up@@ -329,7 +329,7 @@ export class EvaluatorPrimitive extends BasePrimitive<AddEvaluatorOptions, Remov

return {
evaluator_type: standardize(EvaluatorType, evalType),
level: standardize(Level, levelResult.data),
evaluator_level: standardize(EvaluatorLevel, levelResult.data),
};
});
} else {
Expand Down
10 changes: 5 additions & 5 deletions src/cli/primitives/GatewayTargetPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import { runCliCommand, withCommandRunTelemetry } from '../telemetry/cli-command
import {
GATEWAY_TARGET_TYPE_MAP,
GatewayTargetHost,
OutboundAuth,
OutboundAuthType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { getTemplateToolDefinitions, renderGatewayTargetTemplate } from '../templates/GatewayTargetRenderer';
Expand DownExpand Up@@ -337,14 +337,14 @@ export class GatewayTargetPrimitive extends BasePrimitive<AddGatewayTargetOption
const cliType = cliOptions.type ?? '';
const telemetryTargetType = GATEWAY_TARGET_TYPE_MAP[cliType] ?? ('unknown' as const);
const telemetryOutboundAuth = standardize(
OutboundAuth,
OutboundAuthType,
(cliOptions.outboundAuthType ?? 'none').replaceAll('_', '-')
);
const telemetryHost = standardize(GatewayTargetHost, cliOptions.host ?? 'lambda');
const telemetryAttrs = {
target_type: telemetryTargetType,
host: telemetryHost,
outbound_auth: telemetryOutboundAuth,
gateway_target_type: telemetryTargetType,
gateway_target_host: telemetryHost,
outbound_auth_type: telemetryOutboundAuth,
};

// Handle API Gateway targets (no code generation)
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5da7e4b
refactor: decouple TelemetryClient from command_run logic
Hweinstock May 14, 2026
ffbe31f
refactor: make withCommandRun internal, migrate consumers
Hweinstock May 14, 2026
992ad6d
feat: add typed metric registry, MetricName enforced at compile time
Hweinstock May 14, 2026
7a1ded1
docs: update telemetry README with new metric and new command guides
Hweinstock May 14, 2026
50e781d
fix: restore try/catch in recordCommandRun to prevent telemetry crashes
Hweinstock May 14, 2026
328e823
fix: tighten emit() type safety, use MetricName in sinks, rename mode…
Hweinstock May 14, 2026
6468ed7
simplify: derive registry types from COMMAND_SCHEMAS, remove manual C…
Hweinstock May 14, 2026
201185c
simplify: remove dead exports, Command z.enum, and fix deploy/utils d…
Hweinstock May 14, 2026
ab570dd
fix: remove dead CancelResult schema — no code path produces cancel e…
Hweinstock May 14, 2026
1021dc3
fix: rename stale mode→deploy_mode in useDeployFlow diff path
Hweinstock May 14, 2026
36f3c36
test: add coverage for callback-throws path in withCommandRunTelemetry
Hweinstock May 14, 2026
bed69e4
docs: rewrite telemetry README to match implementation
Hweinstock May 14, 2026
4f4c48f
fix: wrap no-client case in try-catch for consistency with other case
Hweinstock May 15, 2026
7702fce
docs: update outdated docstring
Hweinstock May 15, 2026
10d9e96
chore: rebase onto mainline
Hweinstock May 15, 2026
4a2b6ea
feat(telemetry): add MetricRegistry type with descriptions
Hweinstock May 16, 2026
8963e23
refactor: prefix relevant metric name
Hweinstock May 18, 2026
43cbf36
fix: update integ tests with new shapes
Hweinstock May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions integ-tests/create-edge-cases.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,7 +38,7 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'failure',
language: 'python',
agent_language: 'python',
has_agent: 'true',
});
});
Expand DownExpand Up@@ -142,8 +142,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'strands',
agent_language: 'python',
agent_framework: 'strands',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
4 changes: 2 additions & 2 deletions integ-tests/create-frameworks.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,8 +69,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with differen
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'langchain_langgraph',
agent_language: 'python',
agent_framework: 'langchain_langgraph',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
6 changes: 3 additions & 3 deletions integ-tests/dev-server.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -112,10 +112,10 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
ui_mode: 'terminal',
exit_reason: 'success',
protocol: 'http',
agent_protocol: 'http',
});

// Verify failure telemetry when invoking a non-running port
Expand All@@ -125,7 +125,7 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
exit_reason: 'failure',
});

Expand Down
20 changes: 10 additions & 10 deletions src/cli/commands/create/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,14 +11,14 @@ import { LIFECYCLE_TIMEOUT_MAX, LIFECYCLE_TIMEOUT_MIN } from '../../../schema';
import { getErrorMessage } from '../../errors';
import { runCliCommand } from '../../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -115,12 +115,12 @@ async function handleCreateCLI(options: CreateOptions): Promise<void> {
}

const knownAttrs = {
language: standardize(Language, options.language),
framework: standardize(Framework, options.framework),
agent_language: standardize(AgentLanguage, options.language),
agent_framework: standardize(AgentFramework, options.framework),
model_provider: standardize(ModelProviderEnum, options.modelProvider),
memory: standardize(Memory, options.memory ?? 'none'),
protocol: standardize(Protocol, options.protocol ?? 'http'),
build: standardize(Build, options.build ?? 'codezip'),
memory_type: standardize(MemoryType, options.memory ?? 'none'),
agent_protocol: standardize(AgentProtocol, options.protocol ?? 'http'),
build_type: standardize(TelemetryBuildType, options.build ?? 'codezip'),
agent_type: standardize(AgentType, options.type ?? 'create'),
network_mode: standardize(NetworkModeEnum, options.networkMode ?? 'public'),
has_agent: options.agent !== false,
Expand Down
6 changes: 3 additions & 3 deletions src/cli/commands/deploy/__tests__/utils.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 3,
policy_engine_count: 2,
policy_count: 3,
mode: 'diff',
deploy_mode: 'diff',
});
});

Expand All@@ -39,7 +39,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy',
deploy_mode: 'deploy',
});
});

Expand All@@ -49,6 +49,6 @@ describe('computeDeployAttrs', () => {

expect(attrs.runtime_count).toBe(1);
expect(attrs.memory_count).toBe(0);
expect(attrs.mode).toBe('dry-run');
expect(attrs.deploy_mode).toBe('dry-run');
});
});
7 changes: 3 additions & 4 deletions src/cli/commands/deploy/utils.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
import type { AgentCoreProjectSpec } from '../../../schema';

export type DeployMode = 'deploy' | 'dry-run' | 'diff';
import type { DeployMode } from '../../telemetry/schemas/common-shapes';

export const DEFAULT_DEPLOY_ATTRS = {
runtime_count: 0,
Expand All@@ -12,7 +11,7 @@ export const DEFAULT_DEPLOY_ATTRS = {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy' as DeployMode,
deploy_mode: 'deploy' as DeployMode,
};

export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, mode: DeployMode) {
Expand All@@ -28,6 +27,6 @@ export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, m
gateway_target_count: gateways.reduce((sum, g) => sum + (g.targets ?? []).length, 0),
policy_engine_count: policyEngines.length,
policy_count: policyEngines.reduce((sum, pe) => sum + (pe.policies ?? []).length, 0),
mode,
deploy_mode: mode,
};
}
41 changes: 21 additions & 20 deletions src/cli/commands/dev/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import {
import { OtelCollector, startOtelCollector } from '../../operations/dev/otel';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { FatalError } from '../../tui/components';
import { LayoutProvider } from '../../tui/context';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -214,10 +214,10 @@ export const registerDev = (program: Command) => {
const execResult = await withCommandRunTelemetry(
'dev',
{
action: 'exec' as const,
dev_action: 'exec' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -257,10 +257,10 @@ export const registerDev = (program: Command) => {
const invokeResult = await withCommandRunTelemetry(
'dev',
{
action: 'invoke' as const,
dev_action: 'invoke' as const,
ui_mode: 'terminal' as const,
has_stream: opts.stream ?? false,
protocol: standardize(Protocol, protocol.toLowerCase()),
agent_protocol: standardize(AgentProtocol, protocol.toLowerCase()),
invoke_count: 1,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -384,10 +384,10 @@ export const registerDev = (program: Command) => {
const devResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (config.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (config.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -443,10 +443,10 @@ export const registerDev = (program: Command) => {
const tuiResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -479,20 +479,21 @@ export const registerDev = (program: Command) => {
// Default: launch web UI in browser
// NOTE: Do not copy this pattern. runBrowserMode blocks forever (internal
// await new Promise(() => {})) so we cannot use withCommandRunTelemetry here.
// We emit telemetry eagerly before the blocking call. If startup fails, the
// error propagates to the outer catch. Prefer withCommandRunTelemetry for
// commands that return.
// We emit telemetry eagerly before the blocking call.
{
const client = await TelemetryClientAccessor.get().catch(() => undefined);
const devAttrs = {
action: 'server' as const,
ui_mode: 'browser' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
};
if (client) {
await client.withCommandRun('dev', () => devAttrs);
client.emit('cli.command_run', 0, {
command_group: 'dev',
command: 'dev',
exit_reason: 'success',
dev_action: 'server',
ui_mode: 'browser',
has_stream: false,
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
});
await client.flush();
}
await runBrowserMode({
workingDir,
Expand Down
12 changes: 5 additions & 7 deletions src/cli/commands/help/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import type { Command } from '@commander-js/extra-typings';

const MODES_HELP = `
Expand DownExpand Up@@ -43,22 +43,20 @@ export const registerHelp = (program: Command) => {
.command('help')
.description('Display help topics')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help', () => {
await withCommandRunTelemetry('help', {}, () => {
console.log('Available help topics: modes');
console.log('Run `agentcore help <topic>` for details.');
return {};
return { success: true as const };
});
});

helpCmd
.command('modes')
.description('Explain interactive vs non-interactive modes')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help.modes', () => {
await withCommandRunTelemetry('help.modes', {}, () => {
console.log(MODES_HELP);
return {};
return { success: true as const };
});
});
};
2 changes: 1 addition & 1 deletion src/cli/commands/invoke/__tests__/invoke.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -87,7 +87,7 @@ describe('invoke command', () => {
telemetry.assertMetricEmitted({
command: 'invoke',
exit_reason: 'failure',
protocol: 'http',
agent_protocol: 'http',
auth_type: 'sigv4',
has_session_id: false,
});
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/invoke/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { type Result, ValidationError, serializeResult } from '../../../lib';
import { getErrorMessage } from '../../errors';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { AuthType, Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, AuthType, standardize } from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
import { requireProject, requireTTY } from '../../tui/guards';
import { InvokeScreen } from '../../tui/screens/invoke';
Expand DownExpand Up@@ -190,8 +190,8 @@ export const registerInvoke = (program: Command) => {
has_stream: cliOptions.stream ?? false,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(
Protocol,
agent_protocol: standardize(
AgentProtocol,
resolveProtocol({ tool: cliOptions.tool } as InvokeOptions, agentProtocol)
),
},
Expand DownExpand Up@@ -247,7 +247,7 @@ export const registerInvoke = (program: Command) => {
has_stream: true,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(Protocol, resolveProtocol({}, agentProtocol)),
agent_protocol: standardize(AgentProtocol, resolveProtocol({}, agentProtocol)),
},
async (): Promise<Result> => {
const { waitUntilExit, unmount } = render(
Expand Down
20 changes: 10 additions & 10 deletions src/cli/primitives/AgentPrimitive.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,15 +48,15 @@ import { setupPythonProject } from '../operations/python';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
AuthorizerType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { createRenderer } from '../templates';
Expand DownExpand Up@@ -364,15 +364,15 @@ export class AgentPrimitive extends BasePrimitive<AddAgentOptions, RemovableReso
}

return {
language: standardize(Language, cliOptions.language),
framework: standardize(Framework, cliOptions.framework),
agent_language: standardize(AgentLanguage, cliOptions.language),
agent_framework: standardize(AgentFramework, cliOptions.framework),
model_provider: standardize(ModelProviderEnum, cliOptions.modelProvider),
agent_type: standardize(AgentType, cliOptions.type ?? 'create'),
build: standardize(Build, cliOptions.build ?? 'CodeZip'),
protocol: standardize(Protocol, cliOptions.protocol ?? 'HTTP'),
build_type: standardize(TelemetryBuildType, cliOptions.build ?? 'CodeZip'),
agent_protocol: standardize(AgentProtocol, cliOptions.protocol ?? 'HTTP'),
network_mode: standardize(NetworkModeEnum, cliOptions.networkMode ?? 'PUBLIC'),
authorizer_type: standardize(AuthorizerType, cliOptions.authorizerType ?? 'NONE'),
memory: standardize(Memory, cliOptions.memory ?? 'none'),
memory_type: standardize(MemoryType, cliOptions.memory ?? 'none'),
};
});
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/primitives/EvaluatorPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ import { EvaluationLevelSchema, EvaluatorSchema, isValidKmsKeyArn } from '../../
import { getErrorMessage } from '../errors';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import { EvaluatorType, Level, standardize } from '../telemetry/schemas/common-shapes.js';
import { EvaluatorLevel, EvaluatorType, standardize } from '../telemetry/schemas/common-shapes.js';
import { renderCodeBasedEvaluatorTemplate } from '../templates/EvaluatorRenderer';
import { requireTTY } from '../tui/guards/tty';
import {
Expand DownExpand Up@@ -329,7 +329,7 @@ export class EvaluatorPrimitive extends BasePrimitive<AddEvaluatorOptions, Remov

return {
evaluator_type: standardize(EvaluatorType, evalType),
level: standardize(Level, levelResult.data),
evaluator_level: standardize(EvaluatorLevel, levelResult.data),
};
});
} else {
Expand Down
10 changes: 5 additions & 5 deletions src/cli/primitives/GatewayTargetPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import { runCliCommand, withCommandRunTelemetry } from '../telemetry/cli-command
import {
GATEWAY_TARGET_TYPE_MAP,
GatewayTargetHost,
OutboundAuth,
OutboundAuthType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { getTemplateToolDefinitions, renderGatewayTargetTemplate } from '../templates/GatewayTargetRenderer';
Expand DownExpand Up@@ -337,14 +337,14 @@ export class GatewayTargetPrimitive extends BasePrimitive<AddGatewayTargetOption
const cliType = cliOptions.type ?? '';
const telemetryTargetType = GATEWAY_TARGET_TYPE_MAP[cliType] ?? ('unknown' as const);
const telemetryOutboundAuth = standardize(
OutboundAuth,
OutboundAuthType,
(cliOptions.outboundAuthType ?? 'none').replaceAll('_', '-')
);
const telemetryHost = standardize(GatewayTargetHost, cliOptions.host ?? 'lambda');
const telemetryAttrs = {
target_type: telemetryTargetType,
host: telemetryHost,
outbound_auth: telemetryOutboundAuth,
gateway_target_type: telemetryTargetType,
gateway_target_host: telemetryHost,
outbound_auth_type: telemetryOutboundAuth,
};

// Handle API Gateway targets (no code generation)
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5da7e4b
refactor: decouple TelemetryClient from command_run logic
Hweinstock May 14, 2026
ffbe31f
refactor: make withCommandRun internal, migrate consumers
Hweinstock May 14, 2026
992ad6d
feat: add typed metric registry, MetricName enforced at compile time
Hweinstock May 14, 2026
7a1ded1
docs: update telemetry README with new metric and new command guides
Hweinstock May 14, 2026
50e781d
fix: restore try/catch in recordCommandRun to prevent telemetry crashes
Hweinstock May 14, 2026
328e823
fix: tighten emit() type safety, use MetricName in sinks, rename mode…
Hweinstock May 14, 2026
6468ed7
simplify: derive registry types from COMMAND_SCHEMAS, remove manual C…
Hweinstock May 14, 2026
201185c
simplify: remove dead exports, Command z.enum, and fix deploy/utils d…
Hweinstock May 14, 2026
ab570dd
fix: remove dead CancelResult schema — no code path produces cancel e…
Hweinstock May 14, 2026
1021dc3
fix: rename stale mode→deploy_mode in useDeployFlow diff path
Hweinstock May 14, 2026
36f3c36
test: add coverage for callback-throws path in withCommandRunTelemetry
Hweinstock May 14, 2026
bed69e4
docs: rewrite telemetry README to match implementation
Hweinstock May 14, 2026
4f4c48f
fix: wrap no-client case in try-catch for consistency with other case
Hweinstock May 15, 2026
7702fce
docs: update outdated docstring
Hweinstock May 15, 2026
10d9e96
chore: rebase onto mainline
Hweinstock May 15, 2026
4a2b6ea
feat(telemetry): add MetricRegistry type with descriptions
Hweinstock May 16, 2026
8963e23
refactor: prefix relevant metric name
Hweinstock May 18, 2026
43cbf36
fix: update integ tests with new shapes
Hweinstock May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions integ-tests/create-edge-cases.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,7 +38,7 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'failure',
language: 'python',
agent_language: 'python',
has_agent: 'true',
});
});
Expand DownExpand Up@@ -142,8 +142,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'strands',
agent_language: 'python',
agent_framework: 'strands',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
4 changes: 2 additions & 2 deletions integ-tests/create-frameworks.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,8 +69,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with differen
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'langchain_langgraph',
agent_language: 'python',
agent_framework: 'langchain_langgraph',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
6 changes: 3 additions & 3 deletions integ-tests/dev-server.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -112,10 +112,10 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
ui_mode: 'terminal',
exit_reason: 'success',
protocol: 'http',
agent_protocol: 'http',
});

// Verify failure telemetry when invoking a non-running port
Expand All@@ -125,7 +125,7 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
exit_reason: 'failure',
});

Expand Down
20 changes: 10 additions & 10 deletions src/cli/commands/create/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,14 +11,14 @@ import { LIFECYCLE_TIMEOUT_MAX, LIFECYCLE_TIMEOUT_MIN } from '../../../schema';
import { getErrorMessage } from '../../errors';
import { runCliCommand } from '../../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -115,12 +115,12 @@ async function handleCreateCLI(options: CreateOptions): Promise<void> {
}

const knownAttrs = {
language: standardize(Language, options.language),
framework: standardize(Framework, options.framework),
agent_language: standardize(AgentLanguage, options.language),
agent_framework: standardize(AgentFramework, options.framework),
model_provider: standardize(ModelProviderEnum, options.modelProvider),
memory: standardize(Memory, options.memory ?? 'none'),
protocol: standardize(Protocol, options.protocol ?? 'http'),
build: standardize(Build, options.build ?? 'codezip'),
memory_type: standardize(MemoryType, options.memory ?? 'none'),
agent_protocol: standardize(AgentProtocol, options.protocol ?? 'http'),
build_type: standardize(TelemetryBuildType, options.build ?? 'codezip'),
agent_type: standardize(AgentType, options.type ?? 'create'),
network_mode: standardize(NetworkModeEnum, options.networkMode ?? 'public'),
has_agent: options.agent !== false,
Expand Down
6 changes: 3 additions & 3 deletions src/cli/commands/deploy/__tests__/utils.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 3,
policy_engine_count: 2,
policy_count: 3,
mode: 'diff',
deploy_mode: 'diff',
});
});

Expand All@@ -39,7 +39,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy',
deploy_mode: 'deploy',
});
});

Expand All@@ -49,6 +49,6 @@ describe('computeDeployAttrs', () => {

expect(attrs.runtime_count).toBe(1);
expect(attrs.memory_count).toBe(0);
expect(attrs.mode).toBe('dry-run');
expect(attrs.deploy_mode).toBe('dry-run');
});
});
7 changes: 3 additions & 4 deletions src/cli/commands/deploy/utils.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
import type { AgentCoreProjectSpec } from '../../../schema';

export type DeployMode = 'deploy' | 'dry-run' | 'diff';
import type { DeployMode } from '../../telemetry/schemas/common-shapes';

export const DEFAULT_DEPLOY_ATTRS = {
runtime_count: 0,
Expand All@@ -12,7 +11,7 @@ export const DEFAULT_DEPLOY_ATTRS = {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy' as DeployMode,
deploy_mode: 'deploy' as DeployMode,
};

export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, mode: DeployMode) {
Expand All@@ -28,6 +27,6 @@ export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, m
gateway_target_count: gateways.reduce((sum, g) => sum + (g.targets ?? []).length, 0),
policy_engine_count: policyEngines.length,
policy_count: policyEngines.reduce((sum, pe) => sum + (pe.policies ?? []).length, 0),
mode,
deploy_mode: mode,
};
}
41 changes: 21 additions & 20 deletions src/cli/commands/dev/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import {
import { OtelCollector, startOtelCollector } from '../../operations/dev/otel';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { FatalError } from '../../tui/components';
import { LayoutProvider } from '../../tui/context';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -214,10 +214,10 @@ export const registerDev = (program: Command) => {
const execResult = await withCommandRunTelemetry(
'dev',
{
action: 'exec' as const,
dev_action: 'exec' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -257,10 +257,10 @@ export const registerDev = (program: Command) => {
const invokeResult = await withCommandRunTelemetry(
'dev',
{
action: 'invoke' as const,
dev_action: 'invoke' as const,
ui_mode: 'terminal' as const,
has_stream: opts.stream ?? false,
protocol: standardize(Protocol, protocol.toLowerCase()),
agent_protocol: standardize(AgentProtocol, protocol.toLowerCase()),
invoke_count: 1,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -384,10 +384,10 @@ export const registerDev = (program: Command) => {
const devResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (config.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (config.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -443,10 +443,10 @@ export const registerDev = (program: Command) => {
const tuiResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -479,20 +479,21 @@ export const registerDev = (program: Command) => {
// Default: launch web UI in browser
// NOTE: Do not copy this pattern. runBrowserMode blocks forever (internal
// await new Promise(() => {})) so we cannot use withCommandRunTelemetry here.
// We emit telemetry eagerly before the blocking call. If startup fails, the
// error propagates to the outer catch. Prefer withCommandRunTelemetry for
// commands that return.
// We emit telemetry eagerly before the blocking call.
{
const client = await TelemetryClientAccessor.get().catch(() => undefined);
const devAttrs = {
action: 'server' as const,
ui_mode: 'browser' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
};
if (client) {
await client.withCommandRun('dev', () => devAttrs);
client.emit('cli.command_run', 0, {
command_group: 'dev',
command: 'dev',
exit_reason: 'success',
dev_action: 'server',
ui_mode: 'browser',
has_stream: false,
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
});
await client.flush();
}
await runBrowserMode({
workingDir,
Expand Down
12 changes: 5 additions & 7 deletions src/cli/commands/help/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import type { Command } from '@commander-js/extra-typings';

const MODES_HELP = `
Expand DownExpand Up@@ -43,22 +43,20 @@ export const registerHelp = (program: Command) => {
.command('help')
.description('Display help topics')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help', () => {
await withCommandRunTelemetry('help', {}, () => {
console.log('Available help topics: modes');
console.log('Run `agentcore help <topic>` for details.');
return {};
return { success: true as const };
});
});

helpCmd
.command('modes')
.description('Explain interactive vs non-interactive modes')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help.modes', () => {
await withCommandRunTelemetry('help.modes', {}, () => {
console.log(MODES_HELP);
return {};
return { success: true as const };
});
});
};
2 changes: 1 addition & 1 deletion src/cli/commands/invoke/__tests__/invoke.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -87,7 +87,7 @@ describe('invoke command', () => {
telemetry.assertMetricEmitted({
command: 'invoke',
exit_reason: 'failure',
protocol: 'http',
agent_protocol: 'http',
auth_type: 'sigv4',
has_session_id: false,
});
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/invoke/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { type Result, ValidationError, serializeResult } from '../../../lib';
import { getErrorMessage } from '../../errors';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { AuthType, Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, AuthType, standardize } from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
import { requireProject, requireTTY } from '../../tui/guards';
import { InvokeScreen } from '../../tui/screens/invoke';
Expand DownExpand Up@@ -190,8 +190,8 @@ export const registerInvoke = (program: Command) => {
has_stream: cliOptions.stream ?? false,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(
Protocol,
agent_protocol: standardize(
AgentProtocol,
resolveProtocol({ tool: cliOptions.tool } as InvokeOptions, agentProtocol)
),
},
Expand DownExpand Up@@ -247,7 +247,7 @@ export const registerInvoke = (program: Command) => {
has_stream: true,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(Protocol, resolveProtocol({}, agentProtocol)),
agent_protocol: standardize(AgentProtocol, resolveProtocol({}, agentProtocol)),
},
async (): Promise<Result> => {
const { waitUntilExit, unmount } = render(
Expand Down
20 changes: 10 additions & 10 deletions src/cli/primitives/AgentPrimitive.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,15 +48,15 @@ import { setupPythonProject } from '../operations/python';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
AuthorizerType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { createRenderer } from '../templates';
Expand DownExpand Up@@ -364,15 +364,15 @@ export class AgentPrimitive extends BasePrimitive<AddAgentOptions, RemovableReso
}

return {
language: standardize(Language, cliOptions.language),
framework: standardize(Framework, cliOptions.framework),
agent_language: standardize(AgentLanguage, cliOptions.language),
agent_framework: standardize(AgentFramework, cliOptions.framework),
model_provider: standardize(ModelProviderEnum, cliOptions.modelProvider),
agent_type: standardize(AgentType, cliOptions.type ?? 'create'),
build: standardize(Build, cliOptions.build ?? 'CodeZip'),
protocol: standardize(Protocol, cliOptions.protocol ?? 'HTTP'),
build_type: standardize(TelemetryBuildType, cliOptions.build ?? 'CodeZip'),
agent_protocol: standardize(AgentProtocol, cliOptions.protocol ?? 'HTTP'),
network_mode: standardize(NetworkModeEnum, cliOptions.networkMode ?? 'PUBLIC'),
authorizer_type: standardize(AuthorizerType, cliOptions.authorizerType ?? 'NONE'),
memory: standardize(Memory, cliOptions.memory ?? 'none'),
memory_type: standardize(MemoryType, cliOptions.memory ?? 'none'),
};
});
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/primitives/EvaluatorPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ import { EvaluationLevelSchema, EvaluatorSchema, isValidKmsKeyArn } from '../../
import { getErrorMessage } from '../errors';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import { EvaluatorType, Level, standardize } from '../telemetry/schemas/common-shapes.js';
import { EvaluatorLevel, EvaluatorType, standardize } from '../telemetry/schemas/common-shapes.js';
import { renderCodeBasedEvaluatorTemplate } from '../templates/EvaluatorRenderer';
import { requireTTY } from '../tui/guards/tty';
import {
Expand DownExpand Up@@ -329,7 +329,7 @@ export class EvaluatorPrimitive extends BasePrimitive<AddEvaluatorOptions, Remov

return {
evaluator_type: standardize(EvaluatorType, evalType),
level: standardize(Level, levelResult.data),
evaluator_level: standardize(EvaluatorLevel, levelResult.data),
};
});
} else {
Expand Down
10 changes: 5 additions & 5 deletions src/cli/primitives/GatewayTargetPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import { runCliCommand, withCommandRunTelemetry } from '../telemetry/cli-command
import {
GATEWAY_TARGET_TYPE_MAP,
GatewayTargetHost,
OutboundAuth,
OutboundAuthType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { getTemplateToolDefinitions, renderGatewayTargetTemplate } from '../templates/GatewayTargetRenderer';
Expand DownExpand Up@@ -337,14 +337,14 @@ export class GatewayTargetPrimitive extends BasePrimitive<AddGatewayTargetOption
const cliType = cliOptions.type ?? '';
const telemetryTargetType = GATEWAY_TARGET_TYPE_MAP[cliType] ?? ('unknown' as const);
const telemetryOutboundAuth = standardize(
OutboundAuth,
OutboundAuthType,
(cliOptions.outboundAuthType ?? 'none').replaceAll('_', '-')
);
const telemetryHost = standardize(GatewayTargetHost, cliOptions.host ?? 'lambda');
const telemetryAttrs = {
target_type: telemetryTargetType,
host: telemetryHost,
outbound_auth: telemetryOutboundAuth,
gateway_target_type: telemetryTargetType,
gateway_target_host: telemetryHost,
outbound_auth_type: telemetryOutboundAuth,
};

// Handle API Gateway targets (no code generation)
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5da7e4b
refactor: decouple TelemetryClient from command_run logic
Hweinstock May 14, 2026
ffbe31f
refactor: make withCommandRun internal, migrate consumers
Hweinstock May 14, 2026
992ad6d
feat: add typed metric registry, MetricName enforced at compile time
Hweinstock May 14, 2026
7a1ded1
docs: update telemetry README with new metric and new command guides
Hweinstock May 14, 2026
50e781d
fix: restore try/catch in recordCommandRun to prevent telemetry crashes
Hweinstock May 14, 2026
328e823
fix: tighten emit() type safety, use MetricName in sinks, rename mode…
Hweinstock May 14, 2026
6468ed7
simplify: derive registry types from COMMAND_SCHEMAS, remove manual C…
Hweinstock May 14, 2026
201185c
simplify: remove dead exports, Command z.enum, and fix deploy/utils d…
Hweinstock May 14, 2026
ab570dd
fix: remove dead CancelResult schema — no code path produces cancel e…
Hweinstock May 14, 2026
1021dc3
fix: rename stale mode→deploy_mode in useDeployFlow diff path
Hweinstock May 14, 2026
36f3c36
test: add coverage for callback-throws path in withCommandRunTelemetry
Hweinstock May 14, 2026
bed69e4
docs: rewrite telemetry README to match implementation
Hweinstock May 14, 2026
4f4c48f
fix: wrap no-client case in try-catch for consistency with other case
Hweinstock May 15, 2026
7702fce
docs: update outdated docstring
Hweinstock May 15, 2026
10d9e96
chore: rebase onto mainline
Hweinstock May 15, 2026
4a2b6ea
feat(telemetry): add MetricRegistry type with descriptions
Hweinstock May 16, 2026
8963e23
refactor: prefix relevant metric name
Hweinstock May 18, 2026
43cbf36
fix: update integ tests with new shapes
Hweinstock May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions integ-tests/create-edge-cases.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,7 +38,7 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'failure',
language: 'python',
agent_language: 'python',
has_agent: 'true',
});
});
Expand DownExpand Up@@ -142,8 +142,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'strands',
agent_language: 'python',
agent_framework: 'strands',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
4 changes: 2 additions & 2 deletions integ-tests/create-frameworks.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,8 +69,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with differen
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'langchain_langgraph',
agent_language: 'python',
agent_framework: 'langchain_langgraph',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
6 changes: 3 additions & 3 deletions integ-tests/dev-server.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -112,10 +112,10 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
ui_mode: 'terminal',
exit_reason: 'success',
protocol: 'http',
agent_protocol: 'http',
});

// Verify failure telemetry when invoking a non-running port
Expand All@@ -125,7 +125,7 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
exit_reason: 'failure',
});

Expand Down
20 changes: 10 additions & 10 deletions src/cli/commands/create/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,14 +11,14 @@ import { LIFECYCLE_TIMEOUT_MAX, LIFECYCLE_TIMEOUT_MIN } from '../../../schema';
import { getErrorMessage } from '../../errors';
import { runCliCommand } from '../../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -115,12 +115,12 @@ async function handleCreateCLI(options: CreateOptions): Promise<void> {
}

const knownAttrs = {
language: standardize(Language, options.language),
framework: standardize(Framework, options.framework),
agent_language: standardize(AgentLanguage, options.language),
agent_framework: standardize(AgentFramework, options.framework),
model_provider: standardize(ModelProviderEnum, options.modelProvider),
memory: standardize(Memory, options.memory ?? 'none'),
protocol: standardize(Protocol, options.protocol ?? 'http'),
build: standardize(Build, options.build ?? 'codezip'),
memory_type: standardize(MemoryType, options.memory ?? 'none'),
agent_protocol: standardize(AgentProtocol, options.protocol ?? 'http'),
build_type: standardize(TelemetryBuildType, options.build ?? 'codezip'),
agent_type: standardize(AgentType, options.type ?? 'create'),
network_mode: standardize(NetworkModeEnum, options.networkMode ?? 'public'),
has_agent: options.agent !== false,
Expand Down
6 changes: 3 additions & 3 deletions src/cli/commands/deploy/__tests__/utils.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 3,
policy_engine_count: 2,
policy_count: 3,
mode: 'diff',
deploy_mode: 'diff',
});
});

Expand All@@ -39,7 +39,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy',
deploy_mode: 'deploy',
});
});

Expand All@@ -49,6 +49,6 @@ describe('computeDeployAttrs', () => {

expect(attrs.runtime_count).toBe(1);
expect(attrs.memory_count).toBe(0);
expect(attrs.mode).toBe('dry-run');
expect(attrs.deploy_mode).toBe('dry-run');
});
});
7 changes: 3 additions & 4 deletions src/cli/commands/deploy/utils.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
import type { AgentCoreProjectSpec } from '../../../schema';

export type DeployMode = 'deploy' | 'dry-run' | 'diff';
import type { DeployMode } from '../../telemetry/schemas/common-shapes';

export const DEFAULT_DEPLOY_ATTRS = {
runtime_count: 0,
Expand All@@ -12,7 +11,7 @@ export const DEFAULT_DEPLOY_ATTRS = {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy' as DeployMode,
deploy_mode: 'deploy' as DeployMode,
};

export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, mode: DeployMode) {
Expand All@@ -28,6 +27,6 @@ export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, m
gateway_target_count: gateways.reduce((sum, g) => sum + (g.targets ?? []).length, 0),
policy_engine_count: policyEngines.length,
policy_count: policyEngines.reduce((sum, pe) => sum + (pe.policies ?? []).length, 0),
mode,
deploy_mode: mode,
};
}
41 changes: 21 additions & 20 deletions src/cli/commands/dev/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import {
import { OtelCollector, startOtelCollector } from '../../operations/dev/otel';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { FatalError } from '../../tui/components';
import { LayoutProvider } from '../../tui/context';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -214,10 +214,10 @@ export const registerDev = (program: Command) => {
const execResult = await withCommandRunTelemetry(
'dev',
{
action: 'exec' as const,
dev_action: 'exec' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -257,10 +257,10 @@ export const registerDev = (program: Command) => {
const invokeResult = await withCommandRunTelemetry(
'dev',
{
action: 'invoke' as const,
dev_action: 'invoke' as const,
ui_mode: 'terminal' as const,
has_stream: opts.stream ?? false,
protocol: standardize(Protocol, protocol.toLowerCase()),
agent_protocol: standardize(AgentProtocol, protocol.toLowerCase()),
invoke_count: 1,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -384,10 +384,10 @@ export const registerDev = (program: Command) => {
const devResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (config.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (config.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -443,10 +443,10 @@ export const registerDev = (program: Command) => {
const tuiResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -479,20 +479,21 @@ export const registerDev = (program: Command) => {
// Default: launch web UI in browser
// NOTE: Do not copy this pattern. runBrowserMode blocks forever (internal
// await new Promise(() => {})) so we cannot use withCommandRunTelemetry here.
// We emit telemetry eagerly before the blocking call. If startup fails, the
// error propagates to the outer catch. Prefer withCommandRunTelemetry for
// commands that return.
// We emit telemetry eagerly before the blocking call.
{
const client = await TelemetryClientAccessor.get().catch(() => undefined);
const devAttrs = {
action: 'server' as const,
ui_mode: 'browser' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
};
if (client) {
await client.withCommandRun('dev', () => devAttrs);
client.emit('cli.command_run', 0, {
command_group: 'dev',
command: 'dev',
exit_reason: 'success',
dev_action: 'server',
ui_mode: 'browser',
has_stream: false,
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
});
await client.flush();
}
await runBrowserMode({
workingDir,
Expand Down
12 changes: 5 additions & 7 deletions src/cli/commands/help/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import type { Command } from '@commander-js/extra-typings';

const MODES_HELP = `
Expand DownExpand Up@@ -43,22 +43,20 @@ export const registerHelp = (program: Command) => {
.command('help')
.description('Display help topics')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help', () => {
await withCommandRunTelemetry('help', {}, () => {
console.log('Available help topics: modes');
console.log('Run `agentcore help <topic>` for details.');
return {};
return { success: true as const };
});
});

helpCmd
.command('modes')
.description('Explain interactive vs non-interactive modes')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help.modes', () => {
await withCommandRunTelemetry('help.modes', {}, () => {
console.log(MODES_HELP);
return {};
return { success: true as const };
});
});
};
2 changes: 1 addition & 1 deletion src/cli/commands/invoke/__tests__/invoke.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -87,7 +87,7 @@ describe('invoke command', () => {
telemetry.assertMetricEmitted({
command: 'invoke',
exit_reason: 'failure',
protocol: 'http',
agent_protocol: 'http',
auth_type: 'sigv4',
has_session_id: false,
});
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/invoke/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { type Result, ValidationError, serializeResult } from '../../../lib';
import { getErrorMessage } from '../../errors';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { AuthType, Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, AuthType, standardize } from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
import { requireProject, requireTTY } from '../../tui/guards';
import { InvokeScreen } from '../../tui/screens/invoke';
Expand DownExpand Up@@ -190,8 +190,8 @@ export const registerInvoke = (program: Command) => {
has_stream: cliOptions.stream ?? false,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(
Protocol,
agent_protocol: standardize(
AgentProtocol,
resolveProtocol({ tool: cliOptions.tool } as InvokeOptions, agentProtocol)
),
},
Expand DownExpand Up@@ -247,7 +247,7 @@ export const registerInvoke = (program: Command) => {
has_stream: true,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(Protocol, resolveProtocol({}, agentProtocol)),
agent_protocol: standardize(AgentProtocol, resolveProtocol({}, agentProtocol)),
},
async (): Promise<Result> => {
const { waitUntilExit, unmount } = render(
Expand Down
20 changes: 10 additions & 10 deletions src/cli/primitives/AgentPrimitive.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,15 +48,15 @@ import { setupPythonProject } from '../operations/python';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
AuthorizerType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { createRenderer } from '../templates';
Expand DownExpand Up@@ -364,15 +364,15 @@ export class AgentPrimitive extends BasePrimitive<AddAgentOptions, RemovableReso
}

return {
language: standardize(Language, cliOptions.language),
framework: standardize(Framework, cliOptions.framework),
agent_language: standardize(AgentLanguage, cliOptions.language),
agent_framework: standardize(AgentFramework, cliOptions.framework),
model_provider: standardize(ModelProviderEnum, cliOptions.modelProvider),
agent_type: standardize(AgentType, cliOptions.type ?? 'create'),
build: standardize(Build, cliOptions.build ?? 'CodeZip'),
protocol: standardize(Protocol, cliOptions.protocol ?? 'HTTP'),
build_type: standardize(TelemetryBuildType, cliOptions.build ?? 'CodeZip'),
agent_protocol: standardize(AgentProtocol, cliOptions.protocol ?? 'HTTP'),
network_mode: standardize(NetworkModeEnum, cliOptions.networkMode ?? 'PUBLIC'),
authorizer_type: standardize(AuthorizerType, cliOptions.authorizerType ?? 'NONE'),
memory: standardize(Memory, cliOptions.memory ?? 'none'),
memory_type: standardize(MemoryType, cliOptions.memory ?? 'none'),
};
});
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/primitives/EvaluatorPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ import { EvaluationLevelSchema, EvaluatorSchema, isValidKmsKeyArn } from '../../
import { getErrorMessage } from '../errors';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import { EvaluatorType, Level, standardize } from '../telemetry/schemas/common-shapes.js';
import { EvaluatorLevel, EvaluatorType, standardize } from '../telemetry/schemas/common-shapes.js';
import { renderCodeBasedEvaluatorTemplate } from '../templates/EvaluatorRenderer';
import { requireTTY } from '../tui/guards/tty';
import {
Expand DownExpand Up@@ -329,7 +329,7 @@ export class EvaluatorPrimitive extends BasePrimitive<AddEvaluatorOptions, Remov

return {
evaluator_type: standardize(EvaluatorType, evalType),
level: standardize(Level, levelResult.data),
evaluator_level: standardize(EvaluatorLevel, levelResult.data),
};
});
} else {
Expand Down
10 changes: 5 additions & 5 deletions src/cli/primitives/GatewayTargetPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import { runCliCommand, withCommandRunTelemetry } from '../telemetry/cli-command
import {
GATEWAY_TARGET_TYPE_MAP,
GatewayTargetHost,
OutboundAuth,
OutboundAuthType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { getTemplateToolDefinitions, renderGatewayTargetTemplate } from '../templates/GatewayTargetRenderer';
Expand DownExpand Up@@ -337,14 +337,14 @@ export class GatewayTargetPrimitive extends BasePrimitive<AddGatewayTargetOption
const cliType = cliOptions.type ?? '';
const telemetryTargetType = GATEWAY_TARGET_TYPE_MAP[cliType] ?? ('unknown' as const);
const telemetryOutboundAuth = standardize(
OutboundAuth,
OutboundAuthType,
(cliOptions.outboundAuthType ?? 'none').replaceAll('_', '-')
);
const telemetryHost = standardize(GatewayTargetHost, cliOptions.host ?? 'lambda');
const telemetryAttrs = {
target_type: telemetryTargetType,
host: telemetryHost,
outbound_auth: telemetryOutboundAuth,
gateway_target_type: telemetryTargetType,
gateway_target_host: telemetryHost,
outbound_auth_type: telemetryOutboundAuth,
};

// Handle API Gateway targets (no code generation)
Expand Down
Loading
Loading
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
5da7e4b
refactor: decouple TelemetryClient from command_run logic
Hweinstock May 14, 2026
ffbe31f
refactor: make withCommandRun internal, migrate consumers
Hweinstock May 14, 2026
992ad6d
feat: add typed metric registry, MetricName enforced at compile time
Hweinstock May 14, 2026
7a1ded1
docs: update telemetry README with new metric and new command guides
Hweinstock May 14, 2026
50e781d
fix: restore try/catch in recordCommandRun to prevent telemetry crashes
Hweinstock May 14, 2026
328e823
fix: tighten emit() type safety, use MetricName in sinks, rename mode…
Hweinstock May 14, 2026
6468ed7
simplify: derive registry types from COMMAND_SCHEMAS, remove manual C…
Hweinstock May 14, 2026
201185c
simplify: remove dead exports, Command z.enum, and fix deploy/utils d…
Hweinstock May 14, 2026
ab570dd
fix: remove dead CancelResult schema — no code path produces cancel e…
Hweinstock May 14, 2026
1021dc3
fix: rename stale mode→deploy_mode in useDeployFlow diff path
Hweinstock May 14, 2026
36f3c36
test: add coverage for callback-throws path in withCommandRunTelemetry
Hweinstock May 14, 2026
bed69e4
docs: rewrite telemetry README to match implementation
Hweinstock May 14, 2026
4f4c48f
fix: wrap no-client case in try-catch for consistency with other case
Hweinstock May 15, 2026
7702fce
docs: update outdated docstring
Hweinstock May 15, 2026
10d9e96
chore: rebase onto mainline
Hweinstock May 15, 2026
4a2b6ea
feat(telemetry): add MetricRegistry type with descriptions
Hweinstock May 16, 2026
8963e23
refactor: prefix relevant metric name
Hweinstock May 18, 2026
43cbf36
fix: update integ tests with new shapes
Hweinstock May 18, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions integ-tests/create-edge-cases.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -38,7 +38,7 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'failure',
language: 'python',
agent_language: 'python',
has_agent: 'true',
});
});
Expand DownExpand Up@@ -142,8 +142,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create edge cases',
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'strands',
agent_language: 'python',
agent_framework: 'strands',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
4 changes: 2 additions & 2 deletions integ-tests/create-frameworks.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -69,8 +69,8 @@ describe.skipIf(!prereqs.npm || !prereqs.git)('integration: create with differen
telemetry.assertMetricEmitted({
command: 'create',
exit_reason: 'success',
language: 'python',
framework: 'langchain_langgraph',
agent_language: 'python',
agent_framework: 'langchain_langgraph',
model_provider: 'bedrock',
has_agent: 'true',
});
Expand Down
6 changes: 3 additions & 3 deletions integ-tests/dev-server.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -112,10 +112,10 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
ui_mode: 'terminal',
exit_reason: 'success',
protocol: 'http',
agent_protocol: 'http',
});

// Verify failure telemetry when invoking a non-running port
Expand All@@ -125,7 +125,7 @@ describe('integration: dev server', () => {

telemetry.assertMetricEmitted({
command: 'dev',
action: 'invoke',
dev_action: 'invoke',
exit_reason: 'failure',
});

Expand Down
20 changes: 10 additions & 10 deletions src/cli/commands/create/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -11,14 +11,14 @@ import { LIFECYCLE_TIMEOUT_MAX, LIFECYCLE_TIMEOUT_MIN } from '../../../schema';
import { getErrorMessage } from '../../errors';
import { runCliCommand } from '../../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -115,12 +115,12 @@ async function handleCreateCLI(options: CreateOptions): Promise<void> {
}

const knownAttrs = {
language: standardize(Language, options.language),
framework: standardize(Framework, options.framework),
agent_language: standardize(AgentLanguage, options.language),
agent_framework: standardize(AgentFramework, options.framework),
model_provider: standardize(ModelProviderEnum, options.modelProvider),
memory: standardize(Memory, options.memory ?? 'none'),
protocol: standardize(Protocol, options.protocol ?? 'http'),
build: standardize(Build, options.build ?? 'codezip'),
memory_type: standardize(MemoryType, options.memory ?? 'none'),
agent_protocol: standardize(AgentProtocol, options.protocol ?? 'http'),
build_type: standardize(TelemetryBuildType, options.build ?? 'codezip'),
agent_type: standardize(AgentType, options.type ?? 'create'),
network_mode: standardize(NetworkModeEnum, options.networkMode ?? 'public'),
has_agent: options.agent !== false,
Expand Down
6 changes: 3 additions & 3 deletions src/cli/commands/deploy/__tests__/utils.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -24,7 +24,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 3,
policy_engine_count: 2,
policy_count: 3,
mode: 'diff',
deploy_mode: 'diff',
});
});

Expand All@@ -39,7 +39,7 @@ describe('computeDeployAttrs', () => {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy',
deploy_mode: 'deploy',
});
});

Expand All@@ -49,6 +49,6 @@ describe('computeDeployAttrs', () => {

expect(attrs.runtime_count).toBe(1);
expect(attrs.memory_count).toBe(0);
expect(attrs.mode).toBe('dry-run');
expect(attrs.deploy_mode).toBe('dry-run');
});
});
7 changes: 3 additions & 4 deletions src/cli/commands/deploy/utils.ts
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
import type { AgentCoreProjectSpec } from '../../../schema';

export type DeployMode = 'deploy' | 'dry-run' | 'diff';
import type { DeployMode } from '../../telemetry/schemas/common-shapes';

export const DEFAULT_DEPLOY_ATTRS = {
runtime_count: 0,
Expand All@@ -12,7 +11,7 @@ export const DEFAULT_DEPLOY_ATTRS = {
gateway_target_count: 0,
policy_engine_count: 0,
policy_count: 0,
mode: 'deploy' as DeployMode,
deploy_mode: 'deploy' as DeployMode,
};

export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, mode: DeployMode) {
Expand All@@ -28,6 +27,6 @@ export function computeDeployAttrs(projectSpec: Partial<AgentCoreProjectSpec>, m
gateway_target_count: gateways.reduce((sum, g) => sum + (g.targets ?? []).length, 0),
policy_engine_count: policyEngines.length,
policy_count: policyEngines.reduce((sum, pe) => sum + (pe.policies ?? []).length, 0),
mode,
deploy_mode: mode,
};
}
41 changes: 21 additions & 20 deletions src/cli/commands/dev/command.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import {
import { OtelCollector, startOtelCollector } from '../../operations/dev/otel';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { FatalError } from '../../tui/components';
import { LayoutProvider } from '../../tui/context';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
Expand DownExpand Up@@ -214,10 +214,10 @@ export const registerDev = (program: Command) => {
const execResult = await withCommandRunTelemetry(
'dev',
{
action: 'exec' as const,
dev_action: 'exec' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -257,10 +257,10 @@ export const registerDev = (program: Command) => {
const invokeResult = await withCommandRunTelemetry(
'dev',
{
action: 'invoke' as const,
dev_action: 'invoke' as const,
ui_mode: 'terminal' as const,
has_stream: opts.stream ?? false,
protocol: standardize(Protocol, protocol.toLowerCase()),
agent_protocol: standardize(AgentProtocol, protocol.toLowerCase()),
invoke_count: 1,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -384,10 +384,10 @@ export const registerDev = (program: Command) => {
const devResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (config.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (config.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -443,10 +443,10 @@ export const registerDev = (program: Command) => {
const tuiResult = await withCommandRunTelemetry(
'dev',
{
action: 'server' as const,
dev_action: 'server' as const,
ui_mode: 'terminal' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
},
async (): Promise<Result> => {
Expand DownExpand Up@@ -479,20 +479,21 @@ export const registerDev = (program: Command) => {
// Default: launch web UI in browser
// NOTE: Do not copy this pattern. runBrowserMode blocks forever (internal
// await new Promise(() => {})) so we cannot use withCommandRunTelemetry here.
// We emit telemetry eagerly before the blocking call. If startup fails, the
// error propagates to the outer catch. Prefer withCommandRunTelemetry for
// commands that return.
// We emit telemetry eagerly before the blocking call.
{
const client = await TelemetryClientAccessor.get().catch(() => undefined);
const devAttrs = {
action: 'server' as const,
ui_mode: 'browser' as const,
has_stream: false,
protocol: standardize(Protocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
};
if (client) {
await client.withCommandRun('dev', () => devAttrs);
client.emit('cli.command_run', 0, {
command_group: 'dev',
command: 'dev',
exit_reason: 'success',
dev_action: 'server',
ui_mode: 'browser',
has_stream: false,
agent_protocol: standardize(AgentProtocol, (targetDevAgent?.protocol ?? 'http').toLowerCase()),
invoke_count: 0,
});
await client.flush();
}
await runBrowserMode({
workingDir,
Expand Down
12 changes: 5 additions & 7 deletions src/cli/commands/help/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
import { TelemetryClientAccessor } from '../../telemetry/client-accessor.js';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import type { Command } from '@commander-js/extra-typings';

const MODES_HELP = `
Expand DownExpand Up@@ -43,22 +43,20 @@ export const registerHelp = (program: Command) => {
.command('help')
.description('Display help topics')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help', () => {
await withCommandRunTelemetry('help', {}, () => {
console.log('Available help topics: modes');
console.log('Run `agentcore help <topic>` for details.');
return {};
return { success: true as const };
});
});

helpCmd
.command('modes')
.description('Explain interactive vs non-interactive modes')
.action(async () => {
const client = await TelemetryClientAccessor.get();
await client.withCommandRun('help.modes', () => {
await withCommandRunTelemetry('help.modes', {}, () => {
console.log(MODES_HELP);
return {};
return { success: true as const };
});
});
};
2 changes: 1 addition & 1 deletion src/cli/commands/invoke/__tests__/invoke.test.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -87,7 +87,7 @@ describe('invoke command', () => {
telemetry.assertMetricEmitted({
command: 'invoke',
exit_reason: 'failure',
protocol: 'http',
agent_protocol: 'http',
auth_type: 'sigv4',
has_session_id: false,
});
Expand Down
8 changes: 4 additions & 4 deletions src/cli/commands/invoke/command.tsx
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
import { type Result, ValidationError, serializeResult } from '../../../lib';
import { getErrorMessage } from '../../errors';
import { withCommandRunTelemetry } from '../../telemetry/cli-command-run.js';
import { AuthType, Protocol, standardize } from '../../telemetry/schemas/common-shapes.js';
import { AgentProtocol, AuthType, standardize } from '../../telemetry/schemas/common-shapes.js';
import { COMMAND_DESCRIPTIONS } from '../../tui/copy';
import { requireProject, requireTTY } from '../../tui/guards';
import { InvokeScreen } from '../../tui/screens/invoke';
Expand DownExpand Up@@ -190,8 +190,8 @@ export const registerInvoke = (program: Command) => {
has_stream: cliOptions.stream ?? false,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(
Protocol,
agent_protocol: standardize(
AgentProtocol,
resolveProtocol({ tool: cliOptions.tool } as InvokeOptions, agentProtocol)
),
},
Expand DownExpand Up@@ -247,7 +247,7 @@ export const registerInvoke = (program: Command) => {
has_stream: true,
has_session_id: !!cliOptions.sessionId,
auth_type: standardize(AuthType, cliOptions.bearerToken ? 'bearer_token' : 'sigv4'),
protocol: standardize(Protocol, resolveProtocol({}, agentProtocol)),
agent_protocol: standardize(AgentProtocol, resolveProtocol({}, agentProtocol)),
},
async (): Promise<Result> => {
const { waitUntilExit, unmount } = render(
Expand Down
20 changes: 10 additions & 10 deletions src/cli/primitives/AgentPrimitive.tsx
Original file line numberDiff line numberDiff line change
Expand Up@@ -48,15 +48,15 @@ import { setupPythonProject } from '../operations/python';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import {
AgentFramework,
AgentLanguage,
AgentProtocol,
AgentType,
AuthorizerType,
Build,
Framework,
Language,
Memory,
MemoryType,
ModelProvider as ModelProviderEnum,
NetworkMode as NetworkModeEnum,
Protocol,
BuildType as TelemetryBuildType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { createRenderer } from '../templates';
Expand DownExpand Up@@ -364,15 +364,15 @@ export class AgentPrimitive extends BasePrimitive<AddAgentOptions, RemovableReso
}

return {
language: standardize(Language, cliOptions.language),
framework: standardize(Framework, cliOptions.framework),
agent_language: standardize(AgentLanguage, cliOptions.language),
agent_framework: standardize(AgentFramework, cliOptions.framework),
model_provider: standardize(ModelProviderEnum, cliOptions.modelProvider),
agent_type: standardize(AgentType, cliOptions.type ?? 'create'),
build: standardize(Build, cliOptions.build ?? 'CodeZip'),
protocol: standardize(Protocol, cliOptions.protocol ?? 'HTTP'),
build_type: standardize(TelemetryBuildType, cliOptions.build ?? 'CodeZip'),
agent_protocol: standardize(AgentProtocol, cliOptions.protocol ?? 'HTTP'),
network_mode: standardize(NetworkModeEnum, cliOptions.networkMode ?? 'PUBLIC'),
authorizer_type: standardize(AuthorizerType, cliOptions.authorizerType ?? 'NONE'),
memory: standardize(Memory, cliOptions.memory ?? 'none'),
memory_type: standardize(MemoryType, cliOptions.memory ?? 'none'),
};
});
} else {
Expand Down
4 changes: 2 additions & 2 deletions src/cli/primitives/EvaluatorPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -5,7 +5,7 @@ import { EvaluationLevelSchema, EvaluatorSchema, isValidKmsKeyArn } from '../../
import { getErrorMessage } from '../errors';
import type { RemovalPreview, SchemaChange } from '../operations/remove/types';
import { runCliCommand } from '../telemetry/cli-command-run.js';
import { EvaluatorType, Level, standardize } from '../telemetry/schemas/common-shapes.js';
import { EvaluatorLevel, EvaluatorType, standardize } from '../telemetry/schemas/common-shapes.js';
import { renderCodeBasedEvaluatorTemplate } from '../templates/EvaluatorRenderer';
import { requireTTY } from '../tui/guards/tty';
import {
Expand DownExpand Up@@ -329,7 +329,7 @@ export class EvaluatorPrimitive extends BasePrimitive<AddEvaluatorOptions, Remov

return {
evaluator_type: standardize(EvaluatorType, evalType),
level: standardize(Level, levelResult.data),
evaluator_level: standardize(EvaluatorLevel, levelResult.data),
};
});
} else {
Expand Down
10 changes: 5 additions & 5 deletions src/cli/primitives/GatewayTargetPrimitive.ts
Original file line numberDiff line numberDiff line change
Expand Up@@ -27,7 +27,7 @@ import { runCliCommand, withCommandRunTelemetry } from '../telemetry/cli-command
import {
GATEWAY_TARGET_TYPE_MAP,
GatewayTargetHost,
OutboundAuth,
OutboundAuthType,
standardize,
} from '../telemetry/schemas/common-shapes.js';
import { getTemplateToolDefinitions, renderGatewayTargetTemplate } from '../templates/GatewayTargetRenderer';
Expand DownExpand Up@@ -337,14 +337,14 @@ export class GatewayTargetPrimitive extends BasePrimitive<AddGatewayTargetOption
const cliType = cliOptions.type ?? '';
const telemetryTargetType = GATEWAY_TARGET_TYPE_MAP[cliType] ?? ('unknown' as const);
const telemetryOutboundAuth = standardize(
OutboundAuth,
OutboundAuthType,
(cliOptions.outboundAuthType ?? 'none').replaceAll('_', '-')
);
const telemetryHost = standardize(GatewayTargetHost, cliOptions.host ?? 'lambda');
const telemetryAttrs = {
target_type: telemetryTargetType,
host: telemetryHost,
outbound_auth: telemetryOutboundAuth,
gateway_target_type: telemetryTargetType,
gateway_target_host: telemetryHost,
outbound_auth_type: telemetryOutboundAuth,
};

// Handle API Gateway targets (no code generation)
Expand Down
Loading
Loading