@evalops/maestro 0.10.12 → 0.10.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/dist/agent/transport/tool-execution-bridge.d.ts.map +1 -1
  2. package/dist/agent/transport/tool-execution-bridge.js +4 -0
  3. package/dist/agent/transport/tool-execution-bridge.js.map +1 -1
  4. package/dist/audit/logger.d.ts +1 -1
  5. package/dist/cli/args.d.ts.map +1 -1
  6. package/dist/cli/args.js +1 -0
  7. package/dist/cli/args.js.map +1 -1
  8. package/dist/cli/commands/evalops.d.ts +1 -0
  9. package/dist/cli/commands/evalops.d.ts.map +1 -1
  10. package/dist/cli/commands/evalops.js +6 -47
  11. package/dist/cli/commands/evalops.js.map +1 -1
  12. package/dist/cli/commands/init.d.ts +2 -1
  13. package/dist/cli/commands/init.d.ts.map +1 -1
  14. package/dist/cli/commands/init.js +33 -19
  15. package/dist/cli/commands/init.js.map +1 -1
  16. package/dist/cli/commands/status.d.ts +2 -0
  17. package/dist/cli/commands/status.d.ts.map +1 -0
  18. package/dist/cli/commands/status.js +11 -0
  19. package/dist/cli/commands/status.js.map +1 -0
  20. package/dist/cli/help.d.ts.map +1 -1
  21. package/dist/cli/help.js +3 -0
  22. package/dist/cli/help.js.map +1 -1
  23. package/dist/cli-tui/tui-renderer/attachment-controller.d.ts.map +1 -1
  24. package/dist/cli-tui/tui-renderer/attachment-controller.js +18 -1
  25. package/dist/cli-tui/tui-renderer/attachment-controller.js.map +1 -1
  26. package/dist/cli.js +2165 -1711
  27. package/dist/evalops/agent-bootstrap.d.ts +9 -0
  28. package/dist/evalops/agent-bootstrap.d.ts.map +1 -1
  29. package/dist/evalops/agent-bootstrap.js +137 -16
  30. package/dist/evalops/agent-bootstrap.js.map +1 -1
  31. package/dist/evalops/managed-context.d.ts +34 -0
  32. package/dist/evalops/managed-context.d.ts.map +1 -0
  33. package/dist/evalops/managed-context.js +183 -0
  34. package/dist/evalops/managed-context.js.map +1 -0
  35. package/dist/main.d.ts.map +1 -1
  36. package/dist/main.js +5 -0
  37. package/dist/main.js.map +1 -1
  38. package/dist/memory/auto-extraction.d.ts.map +1 -1
  39. package/dist/memory/auto-extraction.js +58 -0
  40. package/dist/memory/auto-extraction.js.map +1 -1
  41. package/dist/memory/backend.d.ts +1 -0
  42. package/dist/memory/backend.d.ts.map +1 -1
  43. package/dist/memory/backend.js.map +1 -1
  44. package/dist/memory/service-client.d.ts +1 -0
  45. package/dist/memory/service-client.d.ts.map +1 -1
  46. package/dist/memory/service-client.js +32 -8
  47. package/dist/memory/service-client.js.map +1 -1
  48. package/dist/oauth/storage.d.ts +1 -0
  49. package/dist/oauth/storage.d.ts.map +1 -1
  50. package/dist/oauth/storage.js +6 -0
  51. package/dist/oauth/storage.js.map +1 -1
  52. package/dist/platform/client.d.ts.map +1 -1
  53. package/dist/platform/client.js +3 -0
  54. package/dist/platform/client.js.map +1 -1
  55. package/dist/platform/tool-execution-client.d.ts.map +1 -1
  56. package/dist/platform/tool-execution-client.js +3 -0
  57. package/dist/platform/tool-execution-client.js.map +1 -1
  58. package/dist/telemetry/maestro-event-bus.d.ts.map +1 -1
  59. package/dist/telemetry/maestro-event-bus.js +16 -47
  60. package/dist/telemetry/maestro-event-bus.js.map +1 -1
  61. package/dist/telemetry.d.ts.map +1 -1
  62. package/dist/telemetry.js +98 -2
  63. package/dist/telemetry.js.map +1 -1
  64. package/dist/version.json +2 -2
  65. package/node_modules/@evalops/contracts/package.json +1 -1
  66. package/node_modules/@evalops/tui/package.json +1 -1
  67. package/package.json +4 -4
@@ -0,0 +1,183 @@
1
+ import chalk from "chalk";
2
+ import { getOAuthStorageRevision, loadOAuthCredentials, } from "../oauth/storage.js";
3
+ const PROCESS_CREDENTIAL_CACHE_MS = 30_000;
4
+ let processCredentialCache;
5
+ const ORG_ENV = [
6
+ "MAESTRO_EVALOPS_ORG_ID",
7
+ "EVALOPS_ORGANIZATION_ID",
8
+ "EVALOPS_ORG_ID",
9
+ "MAESTRO_ENTERPRISE_ORG_ID",
10
+ "MAESTRO_LLM_GATEWAY_ORG_ID",
11
+ "MAESTRO_REMOTE_RUNNER_ORG_ID",
12
+ ];
13
+ const WORKSPACE_ENV = [
14
+ "MAESTRO_EVALOPS_WORKSPACE_ID",
15
+ "EVALOPS_WORKSPACE_ID",
16
+ "MAESTRO_REMOTE_RUNNER_WORKSPACE_ID",
17
+ "MAESTRO_WORKSPACE_ID",
18
+ ];
19
+ const USER_ENV = [
20
+ "MAESTRO_EVALOPS_USER_ID",
21
+ "EVALOPS_USER_ID",
22
+ "MAESTRO_USER_ID",
23
+ ];
24
+ const TOKEN_ENV = ["MAESTRO_EVALOPS_ACCESS_TOKEN", "EVALOPS_TOKEN"];
25
+ function nonEmptyString(value) {
26
+ return typeof value === "string" && value.trim().length > 0
27
+ ? value.trim()
28
+ : undefined;
29
+ }
30
+ function readEnv(env, names) {
31
+ for (const name of names) {
32
+ const value = nonEmptyString(env[name]);
33
+ if (value)
34
+ return value;
35
+ }
36
+ return undefined;
37
+ }
38
+ function recordValue(record, key) {
39
+ return nonEmptyString(record?.[key]);
40
+ }
41
+ function asRecord(value) {
42
+ return value && typeof value === "object" && !Array.isArray(value)
43
+ ? value
44
+ : undefined;
45
+ }
46
+ function storedAgentMcp(credentials) {
47
+ const agentMcp = asRecord(credentials?.metadata?.agentMcp);
48
+ if (!agentMcp)
49
+ return undefined;
50
+ return {
51
+ agentId: recordValue(agentMcp, "agentId"),
52
+ apiKey: recordValue(agentMcp, "apiKey"),
53
+ endpoint: recordValue(agentMcp, "endpoint"),
54
+ keyPrefix: recordValue(agentMcp, "keyPrefix"),
55
+ runId: recordValue(agentMcp, "runId"),
56
+ sessionExpiresAt: recordValue(agentMcp, "sessionExpiresAt"),
57
+ workspaceId: recordValue(agentMcp, "workspaceId"),
58
+ };
59
+ }
60
+ function controlPlaneEnvironment(endpoint) {
61
+ if (!endpoint)
62
+ return undefined;
63
+ try {
64
+ const parsed = new URL(endpoint);
65
+ if (parsed.hostname === "app.evalops.dev")
66
+ return "production";
67
+ if (parsed.hostname === "staging.evalops.dev")
68
+ return "staging";
69
+ return parsed.hostname;
70
+ }
71
+ catch {
72
+ return endpoint;
73
+ }
74
+ }
75
+ function safeLoadCredentials(loadCredentials) {
76
+ try {
77
+ return loadCredentials();
78
+ }
79
+ catch {
80
+ return null;
81
+ }
82
+ }
83
+ function loadProcessEvalOpsCredentialsCached() {
84
+ const now = Date.now();
85
+ const revision = getOAuthStorageRevision();
86
+ if (processCredentialCache &&
87
+ processCredentialCache.revision === revision &&
88
+ processCredentialCache.expiresAt > now) {
89
+ return processCredentialCache.credentials;
90
+ }
91
+ const credentials = loadOAuthCredentials("evalops");
92
+ processCredentialCache = {
93
+ credentials,
94
+ expiresAt: now + PROCESS_CREDENTIAL_CACHE_MS,
95
+ revision,
96
+ };
97
+ return credentials;
98
+ }
99
+ export function resolveManagedEvalOpsContext(env = process.env, loadCredentials) {
100
+ const credentials = safeLoadCredentials(loadCredentials ??
101
+ (env === process.env ? loadProcessEvalOpsCredentialsCached : () => null));
102
+ const metadata = credentials?.metadata;
103
+ const providerRef = asRecord(metadata?.providerRef);
104
+ const agentMcp = storedAgentMcp(credentials);
105
+ const accessToken = readEnv(env, TOKEN_ENV) ?? nonEmptyString(credentials?.access);
106
+ const organizationId = readEnv(env, ORG_ENV) ?? nonEmptyString(metadata?.organizationId);
107
+ const workspaceId = readEnv(env, WORKSPACE_ENV) ?? agentMcp?.workspaceId ?? organizationId;
108
+ const agentId = readEnv(env, ["MAESTRO_AGENT_ID"]) ?? agentMcp?.agentId;
109
+ const runId = readEnv(env, ["MAESTRO_AGENT_RUN_ID"]) ?? agentMcp?.runId;
110
+ const authenticated = Boolean(accessToken || credentials);
111
+ const managedAgentSession = Boolean(agentMcp?.apiKey || (readEnv(env, TOKEN_ENV) && (agentId || runId)));
112
+ const managed = Boolean(organizationId && managedAgentSession);
113
+ const mode = managed
114
+ ? "EvalOps managed"
115
+ : authenticated
116
+ ? "EvalOps authenticated"
117
+ : "local";
118
+ return {
119
+ accessToken,
120
+ agentId,
121
+ authenticated,
122
+ controlPlaneEnvironment: controlPlaneEnvironment(agentMcp?.endpoint),
123
+ controlPlaneUrl: agentMcp?.endpoint,
124
+ evidencePublisher: managed ? "EvalOps" : "none",
125
+ expiresAt: credentials?.expires,
126
+ inference: managed ? "managed" : "local",
127
+ keyPrefix: agentMcp?.keyPrefix,
128
+ managed,
129
+ mode,
130
+ organizationId,
131
+ providerRef,
132
+ runId,
133
+ sessionExpiresAt: agentMcp?.sessionExpiresAt,
134
+ sessionId: readEnv(env, ["MAESTRO_SESSION_ID"]),
135
+ traceIngestion: managed && runId ? "live" : "not configured",
136
+ userEmail: nonEmptyString(metadata?.email),
137
+ userId: readEnv(env, USER_ENV) ?? nonEmptyString(metadata?.userId),
138
+ workspaceId,
139
+ };
140
+ }
141
+ export function formatManagedEvalOpsStatus(context, options = {}) {
142
+ const color = options.color ?? true;
143
+ const good = (value) => (color ? chalk.green(value) : value);
144
+ const dim = (value) => (color ? chalk.dim(value) : value);
145
+ const lines = [
146
+ `${good("Mode")}: ${context.mode}`,
147
+ `${good("Control plane")}: ${context.controlPlaneEnvironment ?? "not configured"}`,
148
+ ];
149
+ if (context.controlPlaneUrl) {
150
+ lines.push(`${dim("Control plane URL")}: ${context.controlPlaneUrl}`);
151
+ }
152
+ if (context.userEmail)
153
+ lines.push(`${dim("Authenticated as")}: ${context.userEmail}`);
154
+ if (context.organizationId)
155
+ lines.push(`${dim("Organization")}: ${context.organizationId}`);
156
+ if (context.workspaceId)
157
+ lines.push(`${dim("Workspace")}: ${context.workspaceId}`);
158
+ lines.push(`${good("Agent runtime")}: ${context.agentId ? "registered" : "not registered"}`);
159
+ if (context.agentId)
160
+ lines.push(`${dim("Agent")}: ${context.agentId}`);
161
+ if (context.runId)
162
+ lines.push(`${dim("Run")}: ${context.runId}`);
163
+ lines.push(`${good("Trace ingestion")}: ${context.traceIngestion}`);
164
+ lines.push(`${good("Evidence publisher")}: ${context.evidencePublisher}`);
165
+ lines.push(`${good("Inference")}: ${context.inference}`);
166
+ if (context.providerRef) {
167
+ const provider = nonEmptyString(context.providerRef.provider) ?? "openai";
168
+ const environment = nonEmptyString(context.providerRef.environment) ?? "prod";
169
+ lines.push(`${dim("Provider ref")}: ${provider}/${environment}`);
170
+ }
171
+ if (context.keyPrefix)
172
+ lines.push(`${dim("API key")}: ${context.keyPrefix}`);
173
+ if (context.sessionExpiresAt) {
174
+ lines.push(`${dim("Agent session expires")}: ${context.sessionExpiresAt}`);
175
+ }
176
+ if (context.expiresAt) {
177
+ const remainingMs = Math.max(0, context.expiresAt - Date.now());
178
+ const minutes = Math.round(remainingMs / 60_000);
179
+ lines.push(`${dim("Access token")}: expires in ~${minutes} minute${minutes === 1 ? "" : "s"}`);
180
+ }
181
+ return lines.join("\n");
182
+ }
183
+ //# sourceMappingURL=managed-context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"managed-context.js","sourceRoot":"","sources":["../../src/evalops/managed-context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAEN,uBAAuB,EACvB,oBAAoB,GACpB,MAAM,qBAAqB,CAAC;AA2C7B,MAAM,2BAA2B,GAAG,MAAM,CAAC;AAC3C,IAAI,sBAMQ,CAAC;AAEb,MAAM,OAAO,GAAG;IACf,wBAAwB;IACxB,yBAAyB;IACzB,gBAAgB;IAChB,2BAA2B;IAC3B,4BAA4B;IAC5B,8BAA8B;CACrB,CAAC;AAEX,MAAM,aAAa,GAAG;IACrB,8BAA8B;IAC9B,sBAAsB;IACtB,oCAAoC;IACpC,sBAAsB;CACb,CAAC;AAEX,MAAM,QAAQ,GAAG;IAChB,yBAAyB;IACzB,iBAAiB;IACjB,iBAAiB;CACR,CAAC;AAEX,MAAM,SAAS,GAAG,CAAC,8BAA8B,EAAE,eAAe,CAAU,CAAC;AAE7E,SAAS,cAAc,CAAC,KAAc;IACrC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAC1D,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE;QACd,CAAC,CAAC,SAAS,CAAC;AACd,CAAC;AAED,SAAS,OAAO,CAAC,GAAQ,EAAE,KAAwB;IAClD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;IACzB,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,SAAS,WAAW,CACnB,MAA2C,EAC3C,GAAW;IAEX,OAAO,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC/B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACjE,CAAC,CAAE,KAAiC;QACpC,CAAC,CAAC,SAAS,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CACtB,WAAoC;IAEpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3D,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,OAAO;QACN,OAAO,EAAE,WAAW,CAAC,QAAQ,EAAE,SAAS,CAAC;QACzC,MAAM,EAAE,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACvC,QAAQ,EAAE,WAAW,CAAC,QAAQ,EAAE,UAAU,CAAC;QAC3C,SAAS,EAAE,WAAW,CAAC,QAAQ,EAAE,WAAW,CAAC;QAC7C,KAAK,EAAE,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC;QACrC,gBAAgB,EAAE,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC;QAC3D,WAAW,EAAE,WAAW,CAAC,QAAQ,EAAE,aAAa,CAAC;KACjD,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC/B,QAA4B;IAE5B,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjC,IAAI,MAAM,CAAC,QAAQ,KAAK,iBAAiB;YAAE,OAAO,YAAY,CAAC;QAC/D,IAAI,MAAM,CAAC,QAAQ,KAAK,qBAAqB;YAAE,OAAO,SAAS,CAAC;QAChE,OAAO,MAAM,CAAC,QAAQ,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,QAAQ,CAAC;IACjB,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB,CAAC,eAAuC;IACnE,IAAI,CAAC;QACJ,OAAO,eAAe,EAAE,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAS,mCAAmC;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,QAAQ,GAAG,uBAAuB,EAAE,CAAC;IAC3C,IACC,sBAAsB;QACtB,sBAAsB,CAAC,QAAQ,KAAK,QAAQ;QAC5C,sBAAsB,CAAC,SAAS,GAAG,GAAG,EACrC,CAAC;QACF,OAAO,sBAAsB,CAAC,WAAW,CAAC;IAC3C,CAAC;IACD,MAAM,WAAW,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IACpD,sBAAsB,GAAG;QACxB,WAAW;QACX,SAAS,EAAE,GAAG,GAAG,2BAA2B;QAC5C,QAAQ;KACR,CAAC;IACF,OAAO,WAAW,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC3C,MAAW,OAAO,CAAC,GAAG,EACtB,eAAwC;IAExC,MAAM,WAAW,GAAG,mBAAmB,CACtC,eAAe;QACd,CAAC,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CACzE,CAAC;IACF,MAAM,QAAQ,GAAG,WAAW,EAAE,QAAQ,CAAC;IACvC,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,WAAW,GAChB,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,cAAc,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,cAAc,GACnB,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IACnE,MAAM,WAAW,GAChB,OAAO,CAAC,GAAG,EAAE,aAAa,CAAC,IAAI,QAAQ,EAAE,WAAW,IAAI,cAAc,CAAC;IACxE,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,kBAAkB,CAAC,CAAC,IAAI,QAAQ,EAAE,OAAO,CAAC;IACxE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,CAAC,IAAI,QAAQ,EAAE,KAAK,CAAC;IACxE,MAAM,aAAa,GAAG,OAAO,CAAC,WAAW,IAAI,WAAW,CAAC,CAAC;IAC1D,MAAM,mBAAmB,GAAG,OAAO,CAClC,QAAQ,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,CAAC,CACnE,CAAC;IACF,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,IAAI,mBAAmB,CAAC,CAAC;IAC/D,MAAM,IAAI,GAAG,OAAO;QACnB,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,aAAa;YACd,CAAC,CAAC,uBAAuB;YACzB,CAAC,CAAC,OAAO,CAAC;IAEZ,OAAO;QACN,WAAW;QACX,OAAO;QACP,aAAa;QACb,uBAAuB,EAAE,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC;QACpE,eAAe,EAAE,QAAQ,EAAE,QAAQ;QACnC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM;QAC/C,SAAS,EAAE,WAAW,EAAE,OAAO;QAC/B,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;QACxC,SAAS,EAAE,QAAQ,EAAE,SAAS;QAC9B,OAAO;QACP,IAAI;QACJ,cAAc;QACd,WAAW;QACX,KAAK;QACL,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB;QAC5C,SAAS,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,oBAAoB,CAAC,CAAC;QAC/C,cAAc,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,gBAAgB;QAC5D,SAAS,EAAE,cAAc,CAAC,QAAQ,EAAE,KAAK,CAAC;QAC1C,MAAM,EAAE,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,CAAC;QAClE,WAAW;KACX,CAAC;AACH,CAAC;AAED,MAAM,UAAU,0BAA0B,CACzC,OAA8B,EAC9B,UAA+B,EAAE;IAEjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC;IACpC,MAAM,IAAI,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACrE,MAAM,GAAG,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,KAAK,GAAG;QACb,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE;QAClC,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,OAAO,CAAC,uBAAuB,IAAI,gBAAgB,EAAE;KAClF,CAAC;IACF,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,mBAAmB,CAAC,KAAK,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,OAAO,CAAC,SAAS;QACpB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,kBAAkB,CAAC,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,cAAc;QACzB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,WAAW;QACtB,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CACT,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAChF,CAAC;IACF,IAAI,OAAO,CAAC,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,IAAI,OAAO,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IACpE,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC1E,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;QAC1E,MAAM,WAAW,GAChB,cAAc,CAAC,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,IAAI,MAAM,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,cAAc,CAAC,KAAK,QAAQ,IAAI,WAAW,EAAE,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,OAAO,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC7E,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,uBAAuB,CAAC,KAAK,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CACT,GAAG,GAAG,CAAC,cAAc,CAAC,iBAAiB,OAAO,UAAU,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAClF,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC","sourcesContent":["import chalk from \"chalk\";\nimport {\n\ttype OAuthCredentials,\n\tgetOAuthStorageRevision,\n\tloadOAuthCredentials,\n} from \"../oauth/storage.js\";\n\ntype Env = Record<string, string | undefined>;\n\nexport type EvalOpsManagedTraceState = \"live\" | \"not configured\";\nexport type EvalOpsManagedEvidencePublisher = \"EvalOps\" | \"none\";\nexport type EvalOpsManagedInferenceState = \"managed\" | \"local\";\n\nexport interface EvalOpsManagedContext {\n\taccessToken?: string;\n\tagentId?: string;\n\tauthenticated: boolean;\n\tcontrolPlaneEnvironment?: string;\n\tcontrolPlaneUrl?: string;\n\tevidencePublisher: EvalOpsManagedEvidencePublisher;\n\texpiresAt?: number;\n\tinference: EvalOpsManagedInferenceState;\n\tkeyPrefix?: string;\n\tmanaged: boolean;\n\tmode: \"EvalOps managed\" | \"EvalOps authenticated\" | \"local\";\n\torganizationId?: string;\n\tproviderRef?: Record<string, unknown>;\n\trunId?: string;\n\tsessionExpiresAt?: string;\n\tsessionId?: string;\n\ttraceIngestion: EvalOpsManagedTraceState;\n\tuserEmail?: string;\n\tuserId?: string;\n\tworkspaceId?: string;\n}\n\ninterface StoredAgentMcpMetadata {\n\tagentId?: string;\n\tapiKey?: string;\n\tendpoint?: string;\n\tkeyPrefix?: string;\n\trunId?: string;\n\tsessionExpiresAt?: string;\n\tworkspaceId?: string;\n}\n\nexport type LoadEvalOpsCredentials = () => OAuthCredentials | null;\n\nconst PROCESS_CREDENTIAL_CACHE_MS = 30_000;\nlet processCredentialCache:\n\t| {\n\t\t\tcredentials: OAuthCredentials | null;\n\t\t\texpiresAt: number;\n\t\t\trevision: number;\n\t }\n\t| undefined;\n\nconst ORG_ENV = [\n\t\"MAESTRO_EVALOPS_ORG_ID\",\n\t\"EVALOPS_ORGANIZATION_ID\",\n\t\"EVALOPS_ORG_ID\",\n\t\"MAESTRO_ENTERPRISE_ORG_ID\",\n\t\"MAESTRO_LLM_GATEWAY_ORG_ID\",\n\t\"MAESTRO_REMOTE_RUNNER_ORG_ID\",\n] as const;\n\nconst WORKSPACE_ENV = [\n\t\"MAESTRO_EVALOPS_WORKSPACE_ID\",\n\t\"EVALOPS_WORKSPACE_ID\",\n\t\"MAESTRO_REMOTE_RUNNER_WORKSPACE_ID\",\n\t\"MAESTRO_WORKSPACE_ID\",\n] as const;\n\nconst USER_ENV = [\n\t\"MAESTRO_EVALOPS_USER_ID\",\n\t\"EVALOPS_USER_ID\",\n\t\"MAESTRO_USER_ID\",\n] as const;\n\nconst TOKEN_ENV = [\"MAESTRO_EVALOPS_ACCESS_TOKEN\", \"EVALOPS_TOKEN\"] as const;\n\nfunction nonEmptyString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.trim().length > 0\n\t\t? value.trim()\n\t\t: undefined;\n}\n\nfunction readEnv(env: Env, names: readonly string[]): string | undefined {\n\tfor (const name of names) {\n\t\tconst value = nonEmptyString(env[name]);\n\t\tif (value) return value;\n\t}\n\treturn undefined;\n}\n\nfunction recordValue(\n\trecord: Record<string, unknown> | undefined,\n\tkey: string,\n): string | undefined {\n\treturn nonEmptyString(record?.[key]);\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn value && typeof value === \"object\" && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\nfunction storedAgentMcp(\n\tcredentials: OAuthCredentials | null,\n): StoredAgentMcpMetadata | undefined {\n\tconst agentMcp = asRecord(credentials?.metadata?.agentMcp);\n\tif (!agentMcp) return undefined;\n\treturn {\n\t\tagentId: recordValue(agentMcp, \"agentId\"),\n\t\tapiKey: recordValue(agentMcp, \"apiKey\"),\n\t\tendpoint: recordValue(agentMcp, \"endpoint\"),\n\t\tkeyPrefix: recordValue(agentMcp, \"keyPrefix\"),\n\t\trunId: recordValue(agentMcp, \"runId\"),\n\t\tsessionExpiresAt: recordValue(agentMcp, \"sessionExpiresAt\"),\n\t\tworkspaceId: recordValue(agentMcp, \"workspaceId\"),\n\t};\n}\n\nfunction controlPlaneEnvironment(\n\tendpoint: string | undefined,\n): string | undefined {\n\tif (!endpoint) return undefined;\n\ttry {\n\t\tconst parsed = new URL(endpoint);\n\t\tif (parsed.hostname === \"app.evalops.dev\") return \"production\";\n\t\tif (parsed.hostname === \"staging.evalops.dev\") return \"staging\";\n\t\treturn parsed.hostname;\n\t} catch {\n\t\treturn endpoint;\n\t}\n}\n\nfunction safeLoadCredentials(loadCredentials: LoadEvalOpsCredentials) {\n\ttry {\n\t\treturn loadCredentials();\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction loadProcessEvalOpsCredentialsCached(): OAuthCredentials | null {\n\tconst now = Date.now();\n\tconst revision = getOAuthStorageRevision();\n\tif (\n\t\tprocessCredentialCache &&\n\t\tprocessCredentialCache.revision === revision &&\n\t\tprocessCredentialCache.expiresAt > now\n\t) {\n\t\treturn processCredentialCache.credentials;\n\t}\n\tconst credentials = loadOAuthCredentials(\"evalops\");\n\tprocessCredentialCache = {\n\t\tcredentials,\n\t\texpiresAt: now + PROCESS_CREDENTIAL_CACHE_MS,\n\t\trevision,\n\t};\n\treturn credentials;\n}\n\nexport function resolveManagedEvalOpsContext(\n\tenv: Env = process.env,\n\tloadCredentials?: LoadEvalOpsCredentials,\n): EvalOpsManagedContext {\n\tconst credentials = safeLoadCredentials(\n\t\tloadCredentials ??\n\t\t\t(env === process.env ? loadProcessEvalOpsCredentialsCached : () => null),\n\t);\n\tconst metadata = credentials?.metadata;\n\tconst providerRef = asRecord(metadata?.providerRef);\n\tconst agentMcp = storedAgentMcp(credentials);\n\tconst accessToken =\n\t\treadEnv(env, TOKEN_ENV) ?? nonEmptyString(credentials?.access);\n\tconst organizationId =\n\t\treadEnv(env, ORG_ENV) ?? nonEmptyString(metadata?.organizationId);\n\tconst workspaceId =\n\t\treadEnv(env, WORKSPACE_ENV) ?? agentMcp?.workspaceId ?? organizationId;\n\tconst agentId = readEnv(env, [\"MAESTRO_AGENT_ID\"]) ?? agentMcp?.agentId;\n\tconst runId = readEnv(env, [\"MAESTRO_AGENT_RUN_ID\"]) ?? agentMcp?.runId;\n\tconst authenticated = Boolean(accessToken || credentials);\n\tconst managedAgentSession = Boolean(\n\t\tagentMcp?.apiKey || (readEnv(env, TOKEN_ENV) && (agentId || runId)),\n\t);\n\tconst managed = Boolean(organizationId && managedAgentSession);\n\tconst mode = managed\n\t\t? \"EvalOps managed\"\n\t\t: authenticated\n\t\t\t? \"EvalOps authenticated\"\n\t\t\t: \"local\";\n\n\treturn {\n\t\taccessToken,\n\t\tagentId,\n\t\tauthenticated,\n\t\tcontrolPlaneEnvironment: controlPlaneEnvironment(agentMcp?.endpoint),\n\t\tcontrolPlaneUrl: agentMcp?.endpoint,\n\t\tevidencePublisher: managed ? \"EvalOps\" : \"none\",\n\t\texpiresAt: credentials?.expires,\n\t\tinference: managed ? \"managed\" : \"local\",\n\t\tkeyPrefix: agentMcp?.keyPrefix,\n\t\tmanaged,\n\t\tmode,\n\t\torganizationId,\n\t\tproviderRef,\n\t\trunId,\n\t\tsessionExpiresAt: agentMcp?.sessionExpiresAt,\n\t\tsessionId: readEnv(env, [\"MAESTRO_SESSION_ID\"]),\n\t\ttraceIngestion: managed && runId ? \"live\" : \"not configured\",\n\t\tuserEmail: nonEmptyString(metadata?.email),\n\t\tuserId: readEnv(env, USER_ENV) ?? nonEmptyString(metadata?.userId),\n\t\tworkspaceId,\n\t};\n}\n\nexport function formatManagedEvalOpsStatus(\n\tcontext: EvalOpsManagedContext,\n\toptions: { color?: boolean } = {},\n): string {\n\tconst color = options.color ?? true;\n\tconst good = (value: string) => (color ? chalk.green(value) : value);\n\tconst dim = (value: string) => (color ? chalk.dim(value) : value);\n\tconst lines = [\n\t\t`${good(\"Mode\")}: ${context.mode}`,\n\t\t`${good(\"Control plane\")}: ${context.controlPlaneEnvironment ?? \"not configured\"}`,\n\t];\n\tif (context.controlPlaneUrl) {\n\t\tlines.push(`${dim(\"Control plane URL\")}: ${context.controlPlaneUrl}`);\n\t}\n\tif (context.userEmail)\n\t\tlines.push(`${dim(\"Authenticated as\")}: ${context.userEmail}`);\n\tif (context.organizationId)\n\t\tlines.push(`${dim(\"Organization\")}: ${context.organizationId}`);\n\tif (context.workspaceId)\n\t\tlines.push(`${dim(\"Workspace\")}: ${context.workspaceId}`);\n\tlines.push(\n\t\t`${good(\"Agent runtime\")}: ${context.agentId ? \"registered\" : \"not registered\"}`,\n\t);\n\tif (context.agentId) lines.push(`${dim(\"Agent\")}: ${context.agentId}`);\n\tif (context.runId) lines.push(`${dim(\"Run\")}: ${context.runId}`);\n\tlines.push(`${good(\"Trace ingestion\")}: ${context.traceIngestion}`);\n\tlines.push(`${good(\"Evidence publisher\")}: ${context.evidencePublisher}`);\n\tlines.push(`${good(\"Inference\")}: ${context.inference}`);\n\tif (context.providerRef) {\n\t\tconst provider = nonEmptyString(context.providerRef.provider) ?? \"openai\";\n\t\tconst environment =\n\t\t\tnonEmptyString(context.providerRef.environment) ?? \"prod\";\n\t\tlines.push(`${dim(\"Provider ref\")}: ${provider}/${environment}`);\n\t}\n\tif (context.keyPrefix) lines.push(`${dim(\"API key\")}: ${context.keyPrefix}`);\n\tif (context.sessionExpiresAt) {\n\t\tlines.push(`${dim(\"Agent session expires\")}: ${context.sessionExpiresAt}`);\n\t}\n\tif (context.expiresAt) {\n\t\tconst remainingMs = Math.max(0, context.expiresAt - Date.now());\n\t\tconst minutes = Math.round(remainingMs / 60_000);\n\t\tlines.push(\n\t\t\t`${dim(\"Access token\")}: expires in ~${minutes} minute${minutes === 1 ? \"\" : \"s\"}`,\n\t\t);\n\t}\n\treturn lines.join(\"\\n\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuFG;AA4TH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBAm+BxC"}
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuFG;AA4TH;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,iBAy+BxC"}
package/dist/main.js CHANGED
@@ -576,6 +576,11 @@ export async function main(args) {
576
576
  await handleEvalOpsCommand(parsed.subcommand, parsed.commandArgs ?? []);
577
577
  return;
578
578
  }
579
+ if (parsed.command === "status") {
580
+ const { handleStatusCommand } = await import("./cli/commands/status.js");
581
+ await handleStatusCommand();
582
+ return;
583
+ }
579
584
  if (parsed.command === "init") {
580
585
  const { handleInitCommand } = await import("./cli/commands/init.js");
581
586
  await handleInitCommand(parsed.commandArgs ?? []);