@clef-sh/agent 0.1.6-beta.22 → 0.1.6-beta.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config.d.ts CHANGED
@@ -1,17 +1,40 @@
1
+ /** VCS provider configuration for fetching artifacts from git. */
2
+ export interface VcsConfig {
3
+ provider: "github" | "gitlab" | "bitbucket";
4
+ repo: string;
5
+ token: string;
6
+ identity: string;
7
+ environment: string;
8
+ ref?: string;
9
+ apiUrl?: string;
10
+ }
11
+ /** Telemetry configuration resolved from environment. */
12
+ export interface TelemetryConfig {
13
+ /** Endpoint URL for telemetry delivery. */
14
+ url: string;
15
+ }
1
16
  /** Resolved agent configuration. */
2
17
  export interface AgentConfig {
3
- /** HTTP URL or local file path to the published artifact. */
4
- source: string;
18
+ /** HTTP URL or local file path to the published artifact. Optional when VCS is configured. */
19
+ source?: string;
20
+ /** VCS provider configuration. */
21
+ vcs?: VcsConfig;
22
+ /** Disk cache path for fallback on VCS failure. */
23
+ cachePath?: string;
5
24
  /** Port for the HTTP API server. */
6
25
  port: number;
7
- /** Seconds between artifact polls. */
8
- pollInterval: number;
26
+ /** Max seconds the agent serves secrets without a successful refresh. */
27
+ cacheTtl: number;
9
28
  /** Inline age private key. */
10
29
  ageKey?: string;
11
30
  /** Path to age key file. */
12
31
  ageKeyFile?: string;
13
32
  /** Bearer token for API authentication. Auto-generated if not set. */
14
33
  token: string;
34
+ /** Unique agent instance ID. Auto-generated if not set. */
35
+ agentId: string;
36
+ /** Telemetry configuration. Present when CLEF_AGENT_TELEMETRY_URL is set. Token is read from packed secrets (CLEF_TELEMETRY_TOKEN key). */
37
+ telemetry?: TelemetryConfig;
15
38
  }
16
39
  /** Errors describing missing or invalid configuration. */
17
40
  export declare class ConfigError extends Error {
@@ -20,14 +43,24 @@ export declare class ConfigError extends Error {
20
43
  /**
21
44
  * Resolve agent configuration from environment variables.
22
45
  *
23
- * | Variable | Default | Description |
24
- * |---------------------------|----------------|--------------------------------------|
25
- * | CLEF_AGENT_SOURCE | (required) | HTTP URL or local file path |
26
- * | CLEF_AGENT_PORT | 7779 | HTTP API port |
27
- * | CLEF_AGENT_POLL_INTERVAL | 30 | Seconds between polls |
28
- * | CLEF_AGENT_AGE_KEY | — | Inline age private key |
29
- * | CLEF_AGENT_AGE_KEY_FILE | — | Path to age key file |
30
- * | CLEF_AGENT_TOKEN | auto-generated | Bearer token for API auth |
46
+ * | Variable | Default | Description |
47
+ * |--------------------------------|----------------|--------------------------------------|
48
+ * | CLEF_AGENT_SOURCE | | HTTP URL or local file path |
49
+ * | CLEF_AGENT_VCS_PROVIDER | | VCS provider (github/gitlab/bitbucket) |
50
+ * | CLEF_AGENT_VCS_REPO | | VCS repository (owner/repo) |
51
+ * | CLEF_AGENT_VCS_TOKEN | — | VCS authentication token |
52
+ * | CLEF_AGENT_VCS_IDENTITY | — | Packed artifact identity |
53
+ * | CLEF_AGENT_VCS_ENVIRONMENT | | Packed artifact environment |
54
+ * | CLEF_AGENT_VCS_REF | — | Git ref (branch/tag/sha) |
55
+ * | CLEF_AGENT_VCS_API_URL | — | Custom VCS API base URL |
56
+ * | CLEF_AGENT_CACHE_PATH | — | Disk cache path for fallback |
57
+ * | CLEF_AGENT_PORT | 7779 | HTTP API port |
58
+ * | CLEF_AGENT_CACHE_TTL | 300 | Max seconds to serve without refresh |
59
+ * | CLEF_AGENT_AGE_KEY | — | Inline age private key |
60
+ * | CLEF_AGENT_AGE_KEY_FILE | — | Path to age key file |
61
+ * | CLEF_AGENT_TOKEN | auto-generated | Bearer token for API auth |
62
+ * | CLEF_AGENT_ID | auto-generated | Unique agent instance ID |
63
+ * | CLEF_AGENT_TELEMETRY_URL | — | Telemetry endpoint URL |
31
64
  */
32
65
  export declare function resolveConfig(env?: Record<string, string | undefined>): AgentConfig;
33
66
  //# sourceMappingURL=config.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,0DAA0D;AAC1D,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,WAAW,CAiChG"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,kEAAkE;AAClE,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,yDAAyD;AACzD,MAAM,WAAW,eAAe;IAC9B,2CAA2C;IAC3C,GAAG,EAAE,MAAM,CAAC;CACb;AAED,oCAAoC;AACpC,MAAM,WAAW,WAAW;IAC1B,8FAA8F;IAC9F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kCAAkC;IAClC,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oCAAoC;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,2IAA2I;IAC3I,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAED,0DAA0D;AAC1D,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,aAAa,CAAC,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,WAAW,CA6EhG"}
package/dist/config.js CHANGED
@@ -14,36 +14,80 @@ exports.ConfigError = ConfigError;
14
14
  /**
15
15
  * Resolve agent configuration from environment variables.
16
16
  *
17
- * | Variable | Default | Description |
18
- * |---------------------------|----------------|--------------------------------------|
19
- * | CLEF_AGENT_SOURCE | (required) | HTTP URL or local file path |
20
- * | CLEF_AGENT_PORT | 7779 | HTTP API port |
21
- * | CLEF_AGENT_POLL_INTERVAL | 30 | Seconds between polls |
22
- * | CLEF_AGENT_AGE_KEY | — | Inline age private key |
23
- * | CLEF_AGENT_AGE_KEY_FILE | — | Path to age key file |
24
- * | CLEF_AGENT_TOKEN | auto-generated | Bearer token for API auth |
17
+ * | Variable | Default | Description |
18
+ * |--------------------------------|----------------|--------------------------------------|
19
+ * | CLEF_AGENT_SOURCE | | HTTP URL or local file path |
20
+ * | CLEF_AGENT_VCS_PROVIDER | | VCS provider (github/gitlab/bitbucket) |
21
+ * | CLEF_AGENT_VCS_REPO | | VCS repository (owner/repo) |
22
+ * | CLEF_AGENT_VCS_TOKEN | — | VCS authentication token |
23
+ * | CLEF_AGENT_VCS_IDENTITY | — | Packed artifact identity |
24
+ * | CLEF_AGENT_VCS_ENVIRONMENT | | Packed artifact environment |
25
+ * | CLEF_AGENT_VCS_REF | — | Git ref (branch/tag/sha) |
26
+ * | CLEF_AGENT_VCS_API_URL | — | Custom VCS API base URL |
27
+ * | CLEF_AGENT_CACHE_PATH | — | Disk cache path for fallback |
28
+ * | CLEF_AGENT_PORT | 7779 | HTTP API port |
29
+ * | CLEF_AGENT_CACHE_TTL | 300 | Max seconds to serve without refresh |
30
+ * | CLEF_AGENT_AGE_KEY | — | Inline age private key |
31
+ * | CLEF_AGENT_AGE_KEY_FILE | — | Path to age key file |
32
+ * | CLEF_AGENT_TOKEN | auto-generated | Bearer token for API auth |
33
+ * | CLEF_AGENT_ID | auto-generated | Unique agent instance ID |
34
+ * | CLEF_AGENT_TELEMETRY_URL | — | Telemetry endpoint URL |
25
35
  */
26
36
  function resolveConfig(env = process.env) {
27
37
  const source = env.CLEF_AGENT_SOURCE;
28
- if (!source) {
29
- throw new ConfigError("CLEF_AGENT_SOURCE is required. Set it to an HTTP URL or local file path.");
38
+ // VCS configuration
39
+ const vcsProvider = env.CLEF_AGENT_VCS_PROVIDER;
40
+ const vcsRepo = env.CLEF_AGENT_VCS_REPO;
41
+ const vcsToken = env.CLEF_AGENT_VCS_TOKEN;
42
+ const vcsIdentity = env.CLEF_AGENT_VCS_IDENTITY;
43
+ const vcsEnvironment = env.CLEF_AGENT_VCS_ENVIRONMENT;
44
+ const vcsRef = env.CLEF_AGENT_VCS_REF;
45
+ const vcsApiUrl = env.CLEF_AGENT_VCS_API_URL;
46
+ const cachePath = env.CLEF_AGENT_CACHE_PATH;
47
+ let vcs;
48
+ // If any VCS var is set, validate all required VCS vars
49
+ const anyVcsSet = vcsProvider || vcsRepo || vcsToken || vcsIdentity || vcsEnvironment;
50
+ if (anyVcsSet) {
51
+ if (!vcsProvider || !vcsRepo || !vcsToken || !vcsIdentity || !vcsEnvironment) {
52
+ throw new ConfigError("When using VCS, all of CLEF_AGENT_VCS_PROVIDER, CLEF_AGENT_VCS_REPO, " +
53
+ "CLEF_AGENT_VCS_TOKEN, CLEF_AGENT_VCS_IDENTITY, and CLEF_AGENT_VCS_ENVIRONMENT must be set.");
54
+ }
55
+ const validProviders = ["github", "gitlab", "bitbucket"];
56
+ if (!validProviders.includes(vcsProvider)) {
57
+ throw new ConfigError(`Invalid CLEF_AGENT_VCS_PROVIDER '${vcsProvider}'. Must be one of: ${validProviders.join(", ")}.`);
58
+ }
59
+ vcs = {
60
+ provider: vcsProvider,
61
+ repo: vcsRepo,
62
+ token: vcsToken,
63
+ identity: vcsIdentity,
64
+ environment: vcsEnvironment,
65
+ ref: vcsRef,
66
+ apiUrl: vcsApiUrl,
67
+ };
68
+ }
69
+ // Require either source or VCS config
70
+ if (!source && !vcs) {
71
+ throw new ConfigError("Either CLEF_AGENT_SOURCE or VCS configuration (CLEF_AGENT_VCS_*) is required.");
30
72
  }
31
73
  const portStr = env.CLEF_AGENT_PORT ?? "7779";
32
74
  const port = parseInt(portStr, 10);
33
75
  if (isNaN(port) || port < 1 || port > 65535) {
34
76
  throw new ConfigError(`Invalid CLEF_AGENT_PORT '${portStr}'. Must be a number between 1 and 65535.`);
35
77
  }
36
- const intervalStr = env.CLEF_AGENT_POLL_INTERVAL ?? "30";
37
- const pollInterval = parseInt(intervalStr, 10);
38
- if (isNaN(pollInterval) || pollInterval < 1) {
39
- throw new ConfigError(`Invalid CLEF_AGENT_POLL_INTERVAL '${intervalStr}'. Must be a positive integer.`);
78
+ const cacheTtlStr = env.CLEF_AGENT_CACHE_TTL ?? "300";
79
+ const cacheTtl = parseInt(cacheTtlStr, 10);
80
+ if (isNaN(cacheTtl) || cacheTtl < 30) {
81
+ throw new ConfigError(`Invalid CLEF_AGENT_CACHE_TTL '${cacheTtlStr}'. Must be an integer >= 30.`);
40
82
  }
41
83
  const ageKey = env.CLEF_AGENT_AGE_KEY;
42
84
  const ageKeyFile = env.CLEF_AGENT_AGE_KEY_FILE;
43
- if (!ageKey && !ageKeyFile) {
44
- throw new ConfigError("Either CLEF_AGENT_AGE_KEY or CLEF_AGENT_AGE_KEY_FILE must be set.");
45
- }
85
+ // Age key is optional — KMS envelope artifacts don't need one
46
86
  const token = env.CLEF_AGENT_TOKEN ?? (0, crypto_1.randomBytes)(32).toString("hex");
47
- return { source, port, pollInterval, ageKey, ageKeyFile, token };
87
+ const agentId = env.CLEF_AGENT_ID ?? (0, crypto_1.randomUUID)();
88
+ // Telemetry: URL enables telemetry; auth token is read from packed secrets (CLEF_TELEMETRY_TOKEN)
89
+ const telemetryUrl = env.CLEF_AGENT_TELEMETRY_URL;
90
+ const telemetry = telemetryUrl ? { url: telemetryUrl } : undefined;
91
+ return { source, vcs, cachePath, port, cacheTtl, ageKey, ageKeyFile, token, agentId, telemetry };
48
92
  }
49
93
  //# sourceMappingURL=config.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;AAsCA,sCAiCC;AAvED,mCAAqC;AAkBrC,0DAA0D;AAC1D,MAAa,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AALD,kCAKC;AAED;;;;;;;;;;;GAWG;AACH,SAAgB,aAAa,CAAC,MAA0C,OAAO,CAAC,GAAG;IACjF,MAAM,MAAM,GAAG,GAAG,CAAC,iBAAiB,CAAC;IACrC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,WAAW,CACnB,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,IAAI,MAAM,CAAC;IAC9C,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;QAC5C,MAAM,IAAI,WAAW,CACnB,4BAA4B,OAAO,0CAA0C,CAC9E,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,wBAAwB,IAAI,IAAI,CAAC;IACzD,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC/C,IAAI,KAAK,CAAC,YAAY,CAAC,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,WAAW,CACnB,qCAAqC,WAAW,gCAAgC,CACjF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,GAAG,CAAC,kBAAkB,CAAC;IACtC,MAAM,UAAU,GAAG,GAAG,CAAC,uBAAuB,CAAC;IAC/C,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,WAAW,CAAC,mEAAmE,CAAC,CAAC;IAC7F,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,gBAAgB,IAAI,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AACnE,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
package/dist/health.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { Request, Response } from "express";
2
- import { SecretsCache } from "./cache";
2
+ import { SecretsCache } from "@clef-sh/runtime";
3
3
  /** Create health endpoint handler (unauthenticated). */
4
- export declare function healthHandler(cache: SecretsCache): (_req: Request, res: Response) => void;
4
+ export declare function healthHandler(cache: SecretsCache, cacheTtl?: number): (_req: Request, res: Response) => void;
5
5
  /** Create readiness endpoint handler (unauthenticated). */
6
- export declare function readyHandler(cache: SecretsCache): (_req: Request, res: Response) => void;
6
+ export declare function readyHandler(cache: SecretsCache, cacheTtl?: number): (_req: Request, res: Response) => void;
7
7
  //# sourceMappingURL=health.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,IACvC,MAAM,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CAM5C;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,IACtC,MAAM,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CAO5C"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,wDAAwD;AACxD,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,IAC1D,MAAM,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CAS5C;AAED,2DAA2D;AAC3D,wBAAgB,YAAY,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,CAAC,EAAE,MAAM,IACzD,MAAM,OAAO,EAAE,KAAK,QAAQ,KAAG,IAAI,CAW5C"}
package/dist/health.js CHANGED
@@ -3,23 +3,29 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.healthHandler = healthHandler;
4
4
  exports.readyHandler = readyHandler;
5
5
  /** Create health endpoint handler (unauthenticated). */
6
- function healthHandler(cache) {
6
+ function healthHandler(cache, cacheTtl) {
7
7
  return (_req, res) => {
8
+ const expired = cacheTtl !== undefined && cache.isExpired(cacheTtl);
8
9
  res.json({
9
10
  status: "ok",
10
11
  revision: cache.getRevision(),
12
+ lastRefreshAt: cache.getSwappedAt(),
13
+ expired,
11
14
  });
12
15
  };
13
16
  }
14
17
  /** Create readiness endpoint handler (unauthenticated). */
15
- function readyHandler(cache) {
18
+ function readyHandler(cache, cacheTtl) {
16
19
  return (_req, res) => {
17
- if (cache.isReady()) {
18
- res.status(200).json({ ready: true });
20
+ if (!cache.isReady()) {
21
+ res.status(503).json({ ready: false, reason: "not_loaded" });
22
+ return;
19
23
  }
20
- else {
21
- res.status(503).json({ ready: false });
24
+ if (cacheTtl !== undefined && cache.isExpired(cacheTtl)) {
25
+ res.status(503).json({ ready: false, reason: "cache_expired" });
26
+ return;
22
27
  }
28
+ res.status(200).json({ ready: true });
23
29
  };
24
30
  }
25
31
  //# sourceMappingURL=health.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":";;AAIA,sCAOC;AAGD,oCAQC;AAnBD,wDAAwD;AACxD,SAAgB,aAAa,CAAC,KAAmB;IAC/C,OAAO,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QAC5C,GAAG,CAAC,IAAI,CAAC;YACP,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE;SAC9B,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,2DAA2D;AAC3D,SAAgB,YAAY,CAAC,KAAmB;IAC9C,OAAO,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QAC5C,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACpB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACzC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":";;AAIA,sCAUC;AAGD,oCAYC;AA1BD,wDAAwD;AACxD,SAAgB,aAAa,CAAC,KAAmB,EAAE,QAAiB;IAClE,OAAO,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QAC5C,MAAM,OAAO,GAAG,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpE,GAAG,CAAC,IAAI,CAAC;YACP,MAAM,EAAE,IAAI;YACZ,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE;YAC7B,aAAa,EAAE,KAAK,CAAC,YAAY,EAAE;YACnC,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED,2DAA2D;AAC3D,SAAgB,YAAY,CAAC,KAAmB,EAAE,QAAiB;IACjE,OAAO,CAAC,IAAa,EAAE,GAAa,EAAQ,EAAE;QAC5C,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QACD,IAAI,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC;AACJ,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,11 +1,10 @@
1
- export { SecretsCache } from "./cache";
2
- export { AgeDecryptor } from "./decryptor";
3
- export { ArtifactPoller } from "./poller";
4
- export type { PollerOptions } from "./poller";
1
+ export { SecretsCache, AgeDecryptor, ArtifactPoller, ClefRuntime, init } from "@clef-sh/runtime";
2
+ export type { PollerOptions, ArtifactEnvelope, RuntimeConfig, VcsProvider, VcsProviderConfig, VcsFileResult, ArtifactSource, ArtifactFetchResult, TelemetryOptions, TelemetryEvent, } from "@clef-sh/runtime";
3
+ export { TelemetryEmitter } from "@clef-sh/runtime";
5
4
  export { startAgentServer } from "./server";
6
5
  export type { AgentServerHandle, AgentServerOptions } from "./server";
7
6
  export { resolveConfig, ConfigError } from "./config";
8
- export type { AgentConfig } from "./config";
7
+ export type { AgentConfig, TelemetryConfig } from "./config";
9
8
  export { healthHandler, readyHandler } from "./health";
10
9
  export { Daemon } from "./lifecycle/daemon";
11
10
  export type { DaemonOptions } from "./lifecycle/daemon";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjG,YAAY,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,iBAAiB,EACjB,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACtD,YAAY,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,YAAY,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC"}
package/dist/index.js CHANGED
@@ -1,12 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LambdaExtension = exports.Daemon = exports.readyHandler = exports.healthHandler = exports.ConfigError = exports.resolveConfig = exports.startAgentServer = exports.ArtifactPoller = exports.AgeDecryptor = exports.SecretsCache = void 0;
4
- var cache_1 = require("./cache");
5
- Object.defineProperty(exports, "SecretsCache", { enumerable: true, get: function () { return cache_1.SecretsCache; } });
6
- var decryptor_1 = require("./decryptor");
7
- Object.defineProperty(exports, "AgeDecryptor", { enumerable: true, get: function () { return decryptor_1.AgeDecryptor; } });
8
- var poller_1 = require("./poller");
9
- Object.defineProperty(exports, "ArtifactPoller", { enumerable: true, get: function () { return poller_1.ArtifactPoller; } });
3
+ exports.LambdaExtension = exports.Daemon = exports.readyHandler = exports.healthHandler = exports.ConfigError = exports.resolveConfig = exports.startAgentServer = exports.TelemetryEmitter = exports.init = exports.ClefRuntime = exports.ArtifactPoller = exports.AgeDecryptor = exports.SecretsCache = void 0;
4
+ // Re-export core modules from @clef-sh/runtime
5
+ var runtime_1 = require("@clef-sh/runtime");
6
+ Object.defineProperty(exports, "SecretsCache", { enumerable: true, get: function () { return runtime_1.SecretsCache; } });
7
+ Object.defineProperty(exports, "AgeDecryptor", { enumerable: true, get: function () { return runtime_1.AgeDecryptor; } });
8
+ Object.defineProperty(exports, "ArtifactPoller", { enumerable: true, get: function () { return runtime_1.ArtifactPoller; } });
9
+ Object.defineProperty(exports, "ClefRuntime", { enumerable: true, get: function () { return runtime_1.ClefRuntime; } });
10
+ Object.defineProperty(exports, "init", { enumerable: true, get: function () { return runtime_1.init; } });
11
+ var runtime_2 = require("@clef-sh/runtime");
12
+ Object.defineProperty(exports, "TelemetryEmitter", { enumerable: true, get: function () { return runtime_2.TelemetryEmitter; } });
13
+ // Agent-specific exports
10
14
  var server_1 = require("./server");
11
15
  Object.defineProperty(exports, "startAgentServer", { enumerable: true, get: function () { return server_1.startAgentServer; } });
12
16
  var config_1 = require("./config");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,iCAAuC;AAA9B,qGAAA,YAAY,OAAA;AACrB,yCAA2C;AAAlC,yGAAA,YAAY,OAAA;AACrB,mCAA0C;AAAjC,wGAAA,cAAc,OAAA;AAEvB,mCAA4C;AAAnC,0GAAA,gBAAgB,OAAA;AAEzB,mCAAsD;AAA7C,uGAAA,aAAa,OAAA;AAAE,qGAAA,WAAW,OAAA;AAEnC,mCAAuD;AAA9C,uGAAA,aAAa,OAAA;AAAE,sGAAA,YAAY,OAAA;AACpC,6CAA4C;AAAnC,gGAAA,MAAM,OAAA;AAEf,iEAA+D;AAAtD,mHAAA,eAAe,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AAC/C,4CAAiG;AAAxF,uGAAA,YAAY,OAAA;AAAE,uGAAA,YAAY,OAAA;AAAE,yGAAA,cAAc,OAAA;AAAE,sGAAA,WAAW,OAAA;AAAE,+FAAA,IAAI,OAAA;AAatE,4CAAoD;AAA3C,2GAAA,gBAAgB,OAAA;AAEzB,yBAAyB;AACzB,mCAA4C;AAAnC,0GAAA,gBAAgB,OAAA;AAEzB,mCAAsD;AAA7C,uGAAA,aAAa,OAAA;AAAE,qGAAA,WAAW,OAAA;AAEnC,mCAAuD;AAA9C,uGAAA,aAAa,OAAA;AAAE,sGAAA,YAAY,OAAA;AACpC,6CAA4C;AAAnC,gGAAA,MAAM,OAAA;AAEf,iEAA+D;AAAtD,mHAAA,eAAe,OAAA"}
@@ -1,8 +1,9 @@
1
- import { ArtifactPoller } from "../poller";
1
+ import { ArtifactPoller, TelemetryEmitter } from "@clef-sh/runtime";
2
2
  import { AgentServerHandle } from "../server";
3
3
  export interface DaemonOptions {
4
4
  poller: ArtifactPoller;
5
5
  server: AgentServerHandle;
6
+ telemetry?: TelemetryEmitter;
6
7
  onLog?: (message: string) => void;
7
8
  }
8
9
  /**
@@ -16,6 +17,7 @@ export declare class Daemon {
16
17
  private readonly options;
17
18
  private shutdownResolve?;
18
19
  private readonly shutdownPromise;
20
+ private readonly startedAt;
19
21
  constructor(options: DaemonOptions);
20
22
  /** Start the daemon and register signal handlers. */
21
23
  start(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/lifecycle/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;;;GAKG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;gBAEpC,OAAO,EAAE,aAAa;IAOlC,qDAAqD;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA8B5B,2EAA2E;IAC3E,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC"}
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/lifecycle/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;;;GAKG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAa;IACrC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAgB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,aAAa;IAQlC,qDAAqD;IAC/C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAuC5B,2EAA2E;IAC3E,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAGjC"}
@@ -12,21 +12,33 @@ class Daemon {
12
12
  options;
13
13
  shutdownResolve;
14
14
  shutdownPromise;
15
+ startedAt;
15
16
  constructor(options) {
16
17
  this.options = options;
18
+ this.startedAt = Date.now();
17
19
  this.shutdownPromise = new Promise((resolve) => {
18
20
  this.shutdownResolve = resolve;
19
21
  });
20
22
  }
21
23
  /** Start the daemon and register signal handlers. */
22
24
  async start() {
23
- const { poller, server, onLog } = this.options;
25
+ const { poller, server, telemetry, onLog } = this.options;
24
26
  const shutdown = async () => {
25
27
  if (this.shutdownRequested)
26
28
  return;
27
29
  this.shutdownRequested = true;
28
30
  onLog?.("Shutting down...");
29
31
  poller.stop();
32
+ telemetry?.agentStopped({
33
+ reason: "signal",
34
+ uptimeSeconds: Math.round((Date.now() - this.startedAt) / 1000),
35
+ });
36
+ try {
37
+ await telemetry?.stopAsync();
38
+ }
39
+ catch {
40
+ // Best-effort flush
41
+ }
30
42
  try {
31
43
  await server.stop();
32
44
  }
@@ -43,8 +55,8 @@ class Daemon {
43
55
  shutdown().catch(() => { });
44
56
  });
45
57
  onLog?.(`Agent server listening at ${server.url}`);
46
- onLog?.("Performing initial fetch...");
47
- await poller.start();
58
+ // main.ts already calls fetchAndDecrypt() only start the polling schedule.
59
+ poller.startPolling();
48
60
  onLog?.("Agent ready. Polling for updates.");
49
61
  }
50
62
  /** Returns a promise that resolves when the daemon has fully shut down. */
@@ -1 +1 @@
1
- {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/lifecycle/daemon.ts"],"names":[],"mappings":";;;AASA;;;;;GAKG;AACH,MAAa,MAAM;IACT,iBAAiB,GAAG,KAAK,CAAC;IACjB,OAAO,CAAgB;IAChC,eAAe,CAAc;IACpB,eAAe,CAAgB;IAEhD,YAAY,OAAsB;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,eAAe,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAE/C,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,IAAI,CAAC,iBAAiB;gBAAE,OAAO;YACnC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,KAAK,EAAE,CAAC,kBAAkB,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,mBAAmB;YACrB,CAAC;YACD,KAAK,EAAE,CAAC,oBAAoB,CAAC,CAAC;YAC9B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QAC3B,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,EAAE,CAAC,6BAA6B,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,KAAK,EAAE,CAAC,6BAA6B,CAAC,CAAC;QACvC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,EAAE,CAAC,mCAAmC,CAAC,CAAC;IAC/C,CAAC;IAED,2EAA2E;IAC3E,eAAe;QACb,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AAhDD,wBAgDC"}
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/lifecycle/daemon.ts"],"names":[],"mappings":";;;AAUA;;;;;GAKG;AACH,MAAa,MAAM;IACT,iBAAiB,GAAG,KAAK,CAAC;IACjB,OAAO,CAAgB;IAChC,eAAe,CAAc;IACpB,eAAe,CAAgB;IAC/B,SAAS,CAAS;IAEnC,YAAY,OAAsB;QAChC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YACnD,IAAI,CAAC,eAAe,GAAG,OAAO,CAAC;QACjC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,qDAAqD;IACrD,KAAK,CAAC,KAAK;QACT,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC;QAE1D,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;YAC1B,IAAI,IAAI,CAAC,iBAAiB;gBAAE,OAAO;YACnC,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC;YAC9B,KAAK,EAAE,CAAC,kBAAkB,CAAC,CAAC;YAC5B,MAAM,CAAC,IAAI,EAAE,CAAC;YACd,SAAS,EAAE,YAAY,CAAC;gBACtB,MAAM,EAAE,QAAQ;gBAChB,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC;aAChE,CAAC,CAAC;YACH,IAAI,CAAC;gBACH,MAAM,SAAS,EAAE,SAAS,EAAE,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,oBAAoB;YACtB,CAAC;YACD,IAAI,CAAC;gBACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACtB,CAAC;YAAC,MAAM,CAAC;gBACP,mBAAmB;YACrB,CAAC;YACD,KAAK,EAAE,CAAC,oBAAoB,CAAC,CAAC;YAC9B,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QAC3B,CAAC,CAAC;QAEF,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;YACzB,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QACH,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,EAAE,CAAC,6BAA6B,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC;QACnD,6EAA6E;QAC7E,MAAM,CAAC,YAAY,EAAE,CAAC;QACtB,KAAK,EAAE,CAAC,mCAAmC,CAAC,CAAC;IAC/C,CAAC;IAED,2EAA2E;IAC3E,eAAe;QACb,OAAO,IAAI,CAAC,eAAe,CAAC;IAC9B,CAAC;CACF;AA3DD,wBA2DC"}
@@ -1,10 +1,11 @@
1
- import { ArtifactPoller } from "../poller";
1
+ import { ArtifactPoller, TelemetryEmitter } from "@clef-sh/runtime";
2
2
  import { AgentServerHandle } from "../server";
3
3
  export interface LambdaExtensionOptions {
4
4
  poller: ArtifactPoller;
5
5
  server: AgentServerHandle;
6
6
  /** TTL in seconds — refresh artifact if older than this on INVOKE. */
7
7
  refreshTtl: number;
8
+ telemetry?: TelemetryEmitter;
8
9
  onLog?: (message: string) => void;
9
10
  }
10
11
  /**
@@ -16,6 +17,7 @@ export interface LambdaExtensionOptions {
16
17
  export declare class LambdaExtension {
17
18
  private lastRefresh;
18
19
  private readonly options;
20
+ private readonly startedAt;
19
21
  constructor(options: LambdaExtensionOptions);
20
22
  /** Run the Lambda Extension lifecycle. */
21
23
  start(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"lambda-extension.d.ts","sourceRoot":"","sources":["../../src/lifecycle/lambda-extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAS9C,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;gBAErC,OAAO,EAAE,sBAAsB;IAI3C,0CAA0C;IACpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAsCd,QAAQ;YAmBR,SAAS;CAYxB"}
1
+ {"version":3,"file":"lambda-extension.d.ts","sourceRoot":"","sources":["../../src/lifecycle/lambda-extension.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAS9C,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,cAAc,CAAC;IACvB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,gBAAgB,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC;AAED;;;;;GAKG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAK;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,OAAO,EAAE,sBAAsB;IAK3C,0CAA0C;IACpC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA+Cd,QAAQ;YAmBR,SAAS;CAYxB"}
@@ -10,12 +10,14 @@ exports.LambdaExtension = void 0;
10
10
  class LambdaExtension {
11
11
  lastRefresh = 0;
12
12
  options;
13
+ startedAt;
13
14
  constructor(options) {
14
15
  this.options = options;
16
+ this.startedAt = Date.now();
15
17
  }
16
18
  /** Run the Lambda Extension lifecycle. */
17
19
  async start() {
18
- const { poller, server, onLog, refreshTtl } = this.options;
20
+ const { poller, server, onLog, refreshTtl, telemetry } = this.options;
19
21
  const extensionId = await this.register();
20
22
  onLog?.(`Registered with Lambda Extensions API (id: ${extensionId})`);
21
23
  onLog?.(`Agent server listening at ${server.url}`);
@@ -29,6 +31,16 @@ class LambdaExtension {
29
31
  if (event.eventType === "SHUTDOWN") {
30
32
  onLog?.("SHUTDOWN event received.");
31
33
  poller.stop();
34
+ telemetry?.agentStopped({
35
+ reason: "lambda_shutdown",
36
+ uptimeSeconds: Math.round((Date.now() - this.startedAt) / 1000),
37
+ });
38
+ try {
39
+ await telemetry?.stopAsync();
40
+ }
41
+ catch {
42
+ // Best-effort flush
43
+ }
32
44
  await server.stop();
33
45
  break;
34
46
  }
@@ -1 +1 @@
1
- {"version":3,"file":"lambda-extension.js","sourceRoot":"","sources":["../../src/lifecycle/lambda-extension.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lambda-extension.js","sourceRoot":"","sources":["../../src/lifecycle/lambda-extension.ts"],"names":[],"mappings":"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"}
package/dist/main.js CHANGED
@@ -8,34 +8,98 @@ Object.defineProperty(exports, "__esModule", { value: true });
8
8
  * cache, server, and daemon, then starts the daemon lifecycle.
9
9
  */
10
10
  const config_1 = require("./config");
11
- const decryptor_1 = require("./decryptor");
12
- const cache_1 = require("./cache");
13
- const poller_1 = require("./poller");
11
+ const runtime_1 = require("@clef-sh/runtime");
14
12
  const server_1 = require("./server");
15
13
  const daemon_1 = require("./lifecycle/daemon");
14
+ const package_json_1 = require("../package.json");
16
15
  async function main() {
17
16
  const config = (0, config_1.resolveConfig)();
18
- const decryptor = new decryptor_1.AgeDecryptor();
19
- const privateKey = decryptor.resolveKey(config.ageKey, config.ageKeyFile);
20
- const cache = new cache_1.SecretsCache();
21
- const poller = new poller_1.ArtifactPoller({
22
- source: config.source,
17
+ // Age key is optional — KMS envelope artifacts don't need one
18
+ let privateKey;
19
+ try {
20
+ const decryptor = new runtime_1.AgeDecryptor();
21
+ privateKey = decryptor.resolveKey(config.ageKey, config.ageKeyFile);
22
+ }
23
+ catch {
24
+ // OK — will work if artifact uses KMS envelope encryption
25
+ }
26
+ // Construct artifact source
27
+ let source;
28
+ if (config.vcs) {
29
+ const provider = (0, runtime_1.createVcsProvider)({
30
+ provider: config.vcs.provider,
31
+ repo: config.vcs.repo,
32
+ token: config.vcs.token,
33
+ ref: config.vcs.ref,
34
+ apiUrl: config.vcs.apiUrl,
35
+ });
36
+ source = new runtime_1.VcsArtifactSource(provider, config.vcs.identity, config.vcs.environment);
37
+ }
38
+ else if (config.source) {
39
+ source =
40
+ config.source.startsWith("http://") || config.source.startsWith("https://")
41
+ ? new runtime_1.HttpArtifactSource(config.source)
42
+ : new runtime_1.FileArtifactSource(config.source);
43
+ }
44
+ else {
45
+ throw new config_1.ConfigError("No artifact source configured.");
46
+ }
47
+ const diskCache = config.cachePath && config.vcs
48
+ ? new runtime_1.DiskCache(config.cachePath, config.vcs.identity, config.vcs.environment)
49
+ : undefined;
50
+ const cache = new runtime_1.SecretsCache();
51
+ const poller = new runtime_1.ArtifactPoller({
52
+ source,
23
53
  privateKey,
24
54
  cache,
25
- pollInterval: config.pollInterval,
55
+ diskCache,
56
+ cacheTtl: config.cacheTtl,
26
57
  onError: (err) => console.error(`[clef-agent] poll error: ${err.message}`),
27
58
  });
28
59
  await poller.fetchAndDecrypt();
60
+ // Telemetry setup — after first fetch so the auth token can be read from packed secrets
61
+ let telemetry;
62
+ if (config.telemetry) {
63
+ // Resolve auth headers from packed secrets
64
+ const headers = {};
65
+ const headersRaw = cache.get("CLEF_TELEMETRY_HEADERS");
66
+ const tokenRaw = cache.get("CLEF_TELEMETRY_TOKEN");
67
+ if (headersRaw) {
68
+ // Comma-separated key=value pairs (OTEL convention)
69
+ for (const pair of headersRaw.split(",")) {
70
+ const eq = pair.indexOf("=");
71
+ if (eq > 0)
72
+ headers[pair.slice(0, eq).trim()] = pair.slice(eq + 1).trim();
73
+ }
74
+ }
75
+ else if (tokenRaw) {
76
+ headers["Authorization"] = `Bearer ${tokenRaw}`;
77
+ }
78
+ const sourceType = config.vcs ? "vcs" : config.source?.startsWith("http") ? "http" : "file";
79
+ telemetry = new runtime_1.TelemetryEmitter({
80
+ url: config.telemetry.url,
81
+ headers: Object.keys(headers).length > 0 ? headers : undefined,
82
+ version: package_json_1.version,
83
+ agentId: config.agentId,
84
+ identity: config.vcs?.identity ?? "unknown",
85
+ environment: config.vcs?.environment ?? "unknown",
86
+ sourceType,
87
+ });
88
+ poller.setTelemetry(telemetry);
89
+ }
29
90
  const server = await (0, server_1.startAgentServer)({
30
91
  port: config.port,
31
92
  token: config.token,
32
93
  cache,
94
+ cacheTtl: config.cacheTtl,
33
95
  });
34
96
  const daemon = new daemon_1.Daemon({
35
97
  poller,
36
98
  server,
99
+ telemetry,
37
100
  onLog: (msg) => console.log(`[clef-agent] ${msg}`),
38
101
  });
102
+ telemetry?.agentStarted({ version: package_json_1.version });
39
103
  console.log(`[clef-agent] token: ${config.token.slice(0, 8)}...`);
40
104
  await daemon.start();
41
105
  }
package/dist/main.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":";;AAAA,iGAAiG;AACjG;;;;;GAKG;AACH,qCAAsD;AACtD,2CAA2C;AAC3C,mCAAuC;AACvC,qCAA0C;AAC1C,qCAA4C;AAC5C,+CAA4C;AAE5C,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,IAAA,sBAAa,GAAE,CAAC;IAE/B,MAAM,SAAS,GAAG,IAAI,wBAAY,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IAE1E,MAAM,KAAK,GAAG,IAAI,oBAAY,EAAE,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,uBAAc,CAAC;QAChC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,UAAU;QACV,KAAK;QACL,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,CAAC,OAAO,EAAE,CAAC;KAC3E,CAAC,CAAC;IAEH,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;IAE/B,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAgB,EAAC;QACpC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK;KACN,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,IAAI,eAAM,CAAC;QACxB,MAAM;QACN,MAAM;QACN,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,EAAE,CAAC;KACnD,CAAC,CAAC;IAEH,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAClE,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;AACvB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,IAAI,GAAG,YAAY,oBAAW,EAAE,CAAC;QAC/B,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"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"}
package/dist/server.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import type { AddressInfo } from "net";
2
- import { SecretsCache } from "./cache";
2
+ import { SecretsCache } from "@clef-sh/runtime";
3
3
  export interface AgentServerHandle {
4
4
  url: string;
5
5
  stop: () => Promise<void>;
@@ -9,6 +9,7 @@ export interface AgentServerOptions {
9
9
  port: number;
10
10
  token: string;
11
11
  cache: SecretsCache;
12
+ cacheTtl?: number;
12
13
  }
13
14
  /**
14
15
  * Start the agent HTTP API server on 127.0.0.1.