@agentmark-ai/cli 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist/.next/BUILD_ID +1 -1
  2. package/dist/.next/build-manifest.json +2 -2
  3. package/dist/.next/cache/.previewinfo +1 -1
  4. package/dist/.next/cache/.rscinfo +1 -1
  5. package/dist/.next/cache/.tsbuildinfo +1 -1
  6. package/dist/.next/cache/config.json +3 -3
  7. package/dist/.next/cache/webpack/client-production/0.pack +0 -0
  8. package/dist/.next/cache/webpack/client-production/index.pack +0 -0
  9. package/dist/.next/cache/webpack/edge-server-production/index.pack +0 -0
  10. package/dist/.next/cache/webpack/server-production/0.pack +0 -0
  11. package/dist/.next/cache/webpack/server-production/index.pack +0 -0
  12. package/dist/.next/prerender-manifest.json +16 -16
  13. package/dist/.next/server/app/_not-found.html +1 -1
  14. package/dist/.next/server/app/_not-found.rsc +1 -1
  15. package/dist/.next/server/app/index.html +1 -1
  16. package/dist/.next/server/app/index.rsc +1 -1
  17. package/dist/.next/server/app/requests.html +1 -1
  18. package/dist/.next/server/app/requests.rsc +1 -1
  19. package/dist/.next/server/app/sessions.html +1 -1
  20. package/dist/.next/server/app/sessions.rsc +1 -1
  21. package/dist/.next/server/app/traces.html +1 -1
  22. package/dist/.next/server/app/traces.rsc +1 -1
  23. package/dist/.next/server/pages/404.html +1 -1
  24. package/dist/.next/server/pages/500.html +1 -1
  25. package/dist/.next/server/server-reference-manifest.json +1 -1
  26. package/dist/.next/trace +54 -54
  27. package/dist/api-server.d.ts +6 -0
  28. package/dist/api-server.js +14 -2
  29. package/dist/api-server.js.map +1 -1
  30. package/dist/auth/auto-link.d.ts +16 -0
  31. package/dist/auth/auto-link.js +140 -0
  32. package/dist/auth/auto-link.js.map +1 -0
  33. package/dist/auth/callback-server.d.ts +12 -0
  34. package/dist/auth/callback-server.js +107 -0
  35. package/dist/auth/callback-server.js.map +1 -0
  36. package/dist/auth/constants.d.ts +6 -0
  37. package/dist/auth/constants.js +11 -0
  38. package/dist/auth/constants.js.map +1 -0
  39. package/dist/auth/credentials.d.ts +30 -0
  40. package/dist/auth/credentials.js +76 -0
  41. package/dist/auth/credentials.js.map +1 -0
  42. package/dist/auth/pkce.d.ts +14 -0
  43. package/dist/auth/pkce.js +39 -0
  44. package/dist/auth/pkce.js.map +1 -0
  45. package/dist/auth/token-refresh.d.ts +7 -0
  46. package/dist/auth/token-refresh.js +52 -0
  47. package/dist/auth/token-refresh.js.map +1 -0
  48. package/dist/auth/types.d.ts +45 -0
  49. package/dist/auth/types.js +6 -0
  50. package/dist/auth/types.js.map +1 -0
  51. package/dist/commands/dev.d.ts +2 -0
  52. package/dist/commands/dev.js +154 -4
  53. package/dist/commands/dev.js.map +1 -1
  54. package/dist/commands/link.d.ts +24 -0
  55. package/dist/commands/link.js +159 -0
  56. package/dist/commands/link.js.map +1 -0
  57. package/dist/commands/login.d.ts +24 -0
  58. package/dist/commands/login.js +100 -0
  59. package/dist/commands/login.js.map +1 -0
  60. package/dist/commands/logout.d.ts +20 -0
  61. package/dist/commands/logout.js +75 -0
  62. package/dist/commands/logout.js.map +1 -0
  63. package/dist/config.d.ts +9 -0
  64. package/dist/config.js.map +1 -1
  65. package/dist/forwarding/config.d.ts +27 -0
  66. package/dist/forwarding/config.js +84 -0
  67. package/dist/forwarding/config.js.map +1 -0
  68. package/dist/forwarding/forwarder.d.ts +69 -0
  69. package/dist/forwarding/forwarder.js +225 -0
  70. package/dist/forwarding/forwarder.js.map +1 -0
  71. package/dist/forwarding/status.d.ts +29 -0
  72. package/dist/forwarding/status.js +57 -0
  73. package/dist/forwarding/status.js.map +1 -0
  74. package/dist/index.js +45 -1
  75. package/dist/index.js.map +1 -1
  76. package/package.json +3 -2
  77. /package/dist/.next/static/{iK92d_yn3LWPbgKedF2FC → UHZduD8h7QLYoDNzYvFUD}/_buildManifest.js +0 -0
  78. /package/dist/.next/static/{iK92d_yn3LWPbgKedF2FC → UHZduD8h7QLYoDNzYvFUD}/_ssgManifest.js +0 -0
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ /**
3
+ * CLI Login Command
4
+ * Feature: 013-trace-tunnel
5
+ *
6
+ * Implements `agentmark login` - authenticates the CLI with the platform using
7
+ * browser-based OAuth with localhost token relay.
8
+ *
9
+ * Flow:
10
+ * - Check existing auth (skip if valid)
11
+ * - Start callback server on random port
12
+ * - Open browser to platform /auth/cli
13
+ * - Platform handles OAuth (Google/GitHub) via Supabase
14
+ * - Platform redirects to localhost callback with session tokens
15
+ * - Save credentials to ~/.agentmark/auth.json
16
+ */
17
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
18
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
21
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
22
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
23
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
24
+ });
25
+ };
26
+ Object.defineProperty(exports, "__esModule", { value: true });
27
+ exports.default = login;
28
+ const pkce_1 = require("../auth/pkce");
29
+ const callback_server_1 = require("../auth/callback-server");
30
+ const credentials_1 = require("../auth/credentials");
31
+ const token_refresh_1 = require("../auth/token-refresh");
32
+ const constants_1 = require("../auth/constants");
33
+ /**
34
+ * Executes the login flow.
35
+ */
36
+ function login() {
37
+ return __awaiter(this, arguments, void 0, function* (options = {}) {
38
+ const platformUrl = options.baseUrl || constants_1.DEFAULT_PLATFORM_URL;
39
+ const supabaseUrl = options.supabaseUrl || constants_1.DEFAULT_SUPABASE_URL;
40
+ const supabaseAnonKey = options.supabaseAnonKey || constants_1.DEFAULT_SUPABASE_ANON_KEY;
41
+ // Step 1: Check existing auth
42
+ const existing = (0, credentials_1.loadCredentials)();
43
+ if (existing) {
44
+ if (!(0, credentials_1.isExpired)(existing)) {
45
+ console.log(`✓ Already logged in as ${existing.email}`);
46
+ return;
47
+ }
48
+ // Try to refresh expired token
49
+ console.log('⚠️ Token expired, attempting refresh...');
50
+ const refreshed = yield (0, token_refresh_1.refreshAccessToken)(existing, supabaseUrl, supabaseAnonKey);
51
+ if (refreshed) {
52
+ console.log(`✓ Token refreshed. Logged in as ${refreshed.email}`);
53
+ return;
54
+ }
55
+ console.log('⚠️ Refresh failed. Starting new login...');
56
+ }
57
+ try {
58
+ // Step 2: Generate state for CSRF protection
59
+ const state = (0, pkce_1.generateState)();
60
+ // Step 3: Start callback server
61
+ const { port, waitForCallback, close } = yield (0, callback_server_1.startCallbackServer)(state);
62
+ // Step 4: Build auth URL
63
+ const authUrl = new URL(`${platformUrl}/auth/cli`);
64
+ authUrl.searchParams.set('redirect_port', port.toString());
65
+ authUrl.searchParams.set('state', state);
66
+ console.log('Opening browser to log in...\n');
67
+ // Step 5: Open browser
68
+ try {
69
+ const open = (yield import('open')).default;
70
+ yield open(authUrl.toString());
71
+ }
72
+ catch (error) {
73
+ console.log(`✗ Failed to open browser automatically.`);
74
+ console.log(`\nVisit this URL manually:\n${authUrl.toString()}\n`);
75
+ }
76
+ // Step 6: Wait for callback with session tokens (30s timeout)
77
+ const result = yield waitForCallback();
78
+ // Step 7: Save credentials
79
+ const credentials = {
80
+ user_id: result.user_id,
81
+ email: result.email,
82
+ access_token: result.access_token,
83
+ refresh_token: result.refresh_token,
84
+ expires_at: result.expires_at,
85
+ created_at: new Date().toISOString(),
86
+ };
87
+ (0, credentials_1.saveCredentials)(credentials);
88
+ console.log(`\n✓ Logged in as ${credentials.email}`);
89
+ close();
90
+ }
91
+ catch (error) {
92
+ if (error.message.includes('timed out')) {
93
+ console.log('\n✗ Login timed out. Please try again.');
94
+ process.exit(1);
95
+ }
96
+ throw error;
97
+ }
98
+ });
99
+ }
100
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../cli-src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * CLI Logout Command
3
+ * Feature: 013-trace-tunnel
4
+ *
5
+ * Implements `agentmark logout` - clears CLI authentication and revokes dev API keys.
6
+ *
7
+ * Per cli-commands.md contract:
8
+ * - Load credentials from ~/.agentmark/auth.json
9
+ * - Load forwarding config from .agentmark/dev-config.json
10
+ * - Revoke dev API key via platform API
11
+ * - Delete auth credentials file
12
+ * - Clear forwarding config
13
+ */
14
+ export interface LogoutOptions {
15
+ baseUrl?: string;
16
+ }
17
+ /**
18
+ * Executes the logout flow.
19
+ */
20
+ export default function logout(options?: LogoutOptions): Promise<void>;
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ /**
3
+ * CLI Logout Command
4
+ * Feature: 013-trace-tunnel
5
+ *
6
+ * Implements `agentmark logout` - clears CLI authentication and revokes dev API keys.
7
+ *
8
+ * Per cli-commands.md contract:
9
+ * - Load credentials from ~/.agentmark/auth.json
10
+ * - Load forwarding config from .agentmark/dev-config.json
11
+ * - Revoke dev API key via platform API
12
+ * - Delete auth credentials file
13
+ * - Clear forwarding config
14
+ */
15
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
16
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
17
+ return new (P || (P = Promise))(function (resolve, reject) {
18
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
19
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
20
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
21
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
22
+ });
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.default = logout;
26
+ const credentials_1 = require("../auth/credentials");
27
+ const config_1 = require("../forwarding/config");
28
+ // Default platform URL
29
+ const DEFAULT_PLATFORM_URL = 'https://app.agentmark.co';
30
+ /**
31
+ * Executes the logout flow.
32
+ */
33
+ function logout() {
34
+ return __awaiter(this, arguments, void 0, function* (options = {}) {
35
+ const platformUrl = options.baseUrl || DEFAULT_PLATFORM_URL;
36
+ // Step 1: Load credentials
37
+ const credentials = (0, credentials_1.loadCredentials)();
38
+ if (!credentials) {
39
+ console.log('Not logged in.');
40
+ return;
41
+ }
42
+ // Step 2: Load forwarding config
43
+ const forwardingConfig = (0, config_1.loadForwardingConfig)();
44
+ // Step 3: Revoke dev API key if it exists
45
+ if (forwardingConfig === null || forwardingConfig === void 0 ? void 0 : forwardingConfig.apiKeyId) {
46
+ try {
47
+ const revokeUrl = `${platformUrl}/api/cli/dev-key/${forwardingConfig.apiKeyId}`;
48
+ const response = yield fetch(revokeUrl, {
49
+ method: 'DELETE',
50
+ headers: {
51
+ Authorization: `Bearer ${credentials.access_token}`,
52
+ },
53
+ });
54
+ if (response.ok) {
55
+ console.log('✓ Dev API key revoked');
56
+ }
57
+ else if (response.status === 404) {
58
+ // Key already revoked or doesn't exist - that's fine
59
+ }
60
+ else {
61
+ console.log('⚠️ Failed to revoke dev API key (continuing anyway)');
62
+ }
63
+ }
64
+ catch (error) {
65
+ console.log('⚠️ Failed to revoke dev API key (continuing anyway)');
66
+ }
67
+ }
68
+ // Step 4: Clear credentials file
69
+ (0, credentials_1.clearCredentials)();
70
+ // Step 5: Clear forwarding config
71
+ (0, config_1.clearForwardingConfig)();
72
+ console.log('✓ Logged out. Dev API keys revoked.');
73
+ });
74
+ }
75
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../cli-src/commands/logout.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;;;;;;;;;;AAqBH,yBA6CC;AAhED,qDAG6B;AAC7B,iDAG8B;AAE9B,uBAAuB;AACvB,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAMxD;;GAEG;AACH,SAA8B,MAAM;yDAClC,UAAyB,EAAE;QAE3B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,IAAI,oBAAoB,CAAC;QAE5D,2BAA2B;QAC3B,MAAM,WAAW,GAAG,IAAA,6BAAe,GAAE,CAAC;QACtC,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QAED,iCAAiC;QACjC,MAAM,gBAAgB,GAAG,IAAA,6BAAoB,GAAE,CAAC;QAEhD,0CAA0C;QAC1C,IAAI,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,QAAQ,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,MAAM,SAAS,GAAG,GAAG,WAAW,oBAAoB,gBAAgB,CAAC,QAAQ,EAAE,CAAC;gBAChF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,SAAS,EAAE;oBACtC,MAAM,EAAE,QAAQ;oBAChB,OAAO,EAAE;wBACP,aAAa,EAAE,UAAU,WAAW,CAAC,YAAY,EAAE;qBACpD;iBACF,CAAC,CAAC;gBAEH,IAAI,QAAQ,CAAC,EAAE,EAAE,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;gBACvC,CAAC;qBAAM,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;oBACnC,qDAAqD;gBACvD,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;gBACtE,CAAC;YACH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QAED,iCAAiC;QACjC,IAAA,8BAAgB,GAAE,CAAC;QAEnB,kCAAkC;QAClC,IAAA,8BAAqB,GAAE,CAAC;QAExB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACrD,CAAC;CAAA"}
package/dist/config.d.ts CHANGED
@@ -7,6 +7,15 @@ export interface LocalConfig {
7
7
  tunnelSubdomain?: string;
8
8
  createdAt?: string;
9
9
  appPort?: number;
10
+ forwarding?: {
11
+ appId?: string;
12
+ appName?: string;
13
+ tenantId?: string;
14
+ apiKey?: string;
15
+ apiKeyId?: string;
16
+ expiresAt?: string;
17
+ baseUrl?: string;
18
+ };
10
19
  }
11
20
  /**
12
21
  * Loads the local development configuration.
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../cli-src/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../cli-src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Forwarding configuration read/write.
3
+ * Manages the `forwarding` section of the shared `.agentmark/dev-config.json` file.
4
+ */
5
+ import { LocalConfig } from '../config';
6
+ export type ForwardingConfig = NonNullable<LocalConfig['forwarding']>;
7
+ /**
8
+ * Loads the forwarding configuration from the shared dev-config.json.
9
+ * Returns null if no forwarding config has been saved.
10
+ */
11
+ export declare function loadForwardingConfig(): ForwardingConfig | null;
12
+ /**
13
+ * Saves forwarding configuration into the shared dev-config.json.
14
+ * Merges with the existing config so other fields are preserved.
15
+ */
16
+ export declare function saveForwardingConfig(forwarding: ForwardingConfig): void;
17
+ /**
18
+ * Removes the forwarding configuration from the shared dev-config.json.
19
+ * Preserves all other config fields.
20
+ */
21
+ export declare function clearForwardingConfig(): void;
22
+ /**
23
+ * Checks whether the API key in the forwarding config has expired.
24
+ * Returns true if `expiresAt` is set and is in the past.
25
+ * Returns false if `expiresAt` is not set (no expiration).
26
+ */
27
+ export declare function isKeyExpired(config: ForwardingConfig): boolean;
@@ -0,0 +1,84 @@
1
+ "use strict";
2
+ /**
3
+ * Forwarding configuration read/write.
4
+ * Manages the `forwarding` section of the shared `.agentmark/dev-config.json` file.
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.loadForwardingConfig = loadForwardingConfig;
11
+ exports.saveForwardingConfig = saveForwardingConfig;
12
+ exports.clearForwardingConfig = clearForwardingConfig;
13
+ exports.isKeyExpired = isKeyExpired;
14
+ const fs_1 = __importDefault(require("fs"));
15
+ const path_1 = __importDefault(require("path"));
16
+ const os_1 = __importDefault(require("os"));
17
+ const config_1 = require("../config");
18
+ /**
19
+ * Returns the path to the shared dev-config.json file.
20
+ * Mirrors the logic in ../config.ts to ensure both modules
21
+ * read/write the same file.
22
+ */
23
+ function getConfigPath() {
24
+ if (process.env.NODE_ENV === 'test' || process.env.VITEST) {
25
+ return path_1.default.join(os_1.default.tmpdir(), '.agentmark-dev-config.json');
26
+ }
27
+ const cwd = process.cwd();
28
+ return path_1.default.join(cwd, '.agentmark', 'dev-config.json');
29
+ }
30
+ /**
31
+ * Writes the full config object back to the shared config file.
32
+ */
33
+ function writeConfig(config) {
34
+ const configPath = getConfigPath();
35
+ try {
36
+ const configDir = path_1.default.dirname(configPath);
37
+ if (!fs_1.default.existsSync(configDir)) {
38
+ fs_1.default.mkdirSync(configDir, { recursive: true });
39
+ }
40
+ fs_1.default.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
41
+ }
42
+ catch (error) {
43
+ console.error('Error saving forwarding config:', error);
44
+ }
45
+ }
46
+ /**
47
+ * Loads the forwarding configuration from the shared dev-config.json.
48
+ * Returns null if no forwarding config has been saved.
49
+ */
50
+ function loadForwardingConfig() {
51
+ var _a;
52
+ const config = (0, config_1.loadLocalConfig)();
53
+ return (_a = config.forwarding) !== null && _a !== void 0 ? _a : null;
54
+ }
55
+ /**
56
+ * Saves forwarding configuration into the shared dev-config.json.
57
+ * Merges with the existing config so other fields are preserved.
58
+ */
59
+ function saveForwardingConfig(forwarding) {
60
+ const config = (0, config_1.loadLocalConfig)();
61
+ config.forwarding = forwarding;
62
+ writeConfig(config);
63
+ }
64
+ /**
65
+ * Removes the forwarding configuration from the shared dev-config.json.
66
+ * Preserves all other config fields.
67
+ */
68
+ function clearForwardingConfig() {
69
+ const config = (0, config_1.loadLocalConfig)();
70
+ delete config.forwarding;
71
+ writeConfig(config);
72
+ }
73
+ /**
74
+ * Checks whether the API key in the forwarding config has expired.
75
+ * Returns true if `expiresAt` is set and is in the past.
76
+ * Returns false if `expiresAt` is not set (no expiration).
77
+ */
78
+ function isKeyExpired(config) {
79
+ if (!config.expiresAt) {
80
+ return false;
81
+ }
82
+ return new Date(config.expiresAt).getTime() < Date.now();
83
+ }
84
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../cli-src/forwarding/config.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AA4CH,oDAGC;AAMD,oDAIC;AAMD,sDAIC;AAOD,oCAKC;AA7ED,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AACpB,sCAAyD;AAIzD;;;;GAIG;AACH,SAAS,aAAa;IACpB,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;QAC1D,OAAO,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1B,OAAO,cAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,MAAmB;IACtC,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;IAEnC,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,YAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QACD,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB;;IAClC,MAAM,MAAM,GAAG,IAAA,wBAAe,GAAE,CAAC;IACjC,OAAO,MAAA,MAAM,CAAC,UAAU,mCAAI,IAAI,CAAC;AACnC,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,UAA4B;IAC/D,MAAM,MAAM,GAAG,IAAA,wBAAe,GAAE,CAAC;IACjC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,WAAW,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,SAAgB,qBAAqB;IACnC,MAAM,MAAM,GAAG,IAAA,wBAAe,GAAE,CAAC;IACjC,OAAO,MAAM,CAAC,UAAU,CAAC;IACzB,WAAW,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AAED;;;;GAIG;AACH,SAAgB,YAAY,CAAC,MAAwB;IACnD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC3D,CAAC"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Trace Forwarding Service
3
+ * Feature: 013-trace-tunnel
4
+ *
5
+ * Forwards locally-generated traces to the platform gateway in near-real-time.
6
+ *
7
+ * Per forwarding-protocol.md:
8
+ * - In-memory FIFO queue (max 100)
9
+ * - Async HTTP POST with Authorization and X-Agentmark-App-Id headers
10
+ * - Retry policy: 3 retries with exponential backoff (1s, 2s, 4s)
11
+ * - 10s timeout per request
12
+ * - Handle 401 → stop forwarding, 429 → respect Retry-After
13
+ * - Rate limiting: max 50 forwards/second
14
+ */
15
+ import { ForwardingConfig } from './config';
16
+ interface ForwardingStats {
17
+ sent: number;
18
+ failed: number;
19
+ buffered: number;
20
+ }
21
+ type TracePayload = Record<string, unknown>;
22
+ export declare class TraceForwarder {
23
+ private config;
24
+ private queue;
25
+ private stats;
26
+ private isStopped;
27
+ private processingPromise;
28
+ private forwardCount;
29
+ private forwardWindowStart;
30
+ constructor(config: ForwardingConfig);
31
+ /**
32
+ * Enqueues a trace payload for forwarding.
33
+ * Drops oldest trace if queue is full.
34
+ * Never throws — forwarding failures are non-fatal by design.
35
+ */
36
+ enqueue(payload: TracePayload): void;
37
+ /**
38
+ * Checks if we're within the rate limit.
39
+ * Resets the window every second.
40
+ */
41
+ private checkRateLimit;
42
+ /**
43
+ * Processes queued traces asynchronously.
44
+ */
45
+ private processQueue;
46
+ /**
47
+ * Forwards a single trace with retry logic.
48
+ */
49
+ private forwardWithRetry;
50
+ /**
51
+ * Attempts to forward a trace once.
52
+ */
53
+ private forwardOnce;
54
+ /**
55
+ * Flushes all buffered traces with a timeout.
56
+ * Returns the number of traces that could not be flushed.
57
+ */
58
+ flush(timeoutMs?: number): Promise<number>;
59
+ /**
60
+ * Stops the forwarder.
61
+ * No more traces will be accepted after calling stop().
62
+ */
63
+ stop(): void;
64
+ /**
65
+ * Returns current forwarding statistics.
66
+ */
67
+ getStats(): ForwardingStats;
68
+ }
69
+ export {};
@@ -0,0 +1,225 @@
1
+ "use strict";
2
+ /**
3
+ * Trace Forwarding Service
4
+ * Feature: 013-trace-tunnel
5
+ *
6
+ * Forwards locally-generated traces to the platform gateway in near-real-time.
7
+ *
8
+ * Per forwarding-protocol.md:
9
+ * - In-memory FIFO queue (max 100)
10
+ * - Async HTTP POST with Authorization and X-Agentmark-App-Id headers
11
+ * - Retry policy: 3 retries with exponential backoff (1s, 2s, 4s)
12
+ * - 10s timeout per request
13
+ * - Handle 401 → stop forwarding, 429 → respect Retry-After
14
+ * - Rate limiting: max 50 forwards/second
15
+ */
16
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
17
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
18
+ return new (P || (P = Promise))(function (resolve, reject) {
19
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
20
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
21
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
22
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
23
+ });
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.TraceForwarder = void 0;
27
+ const MAX_QUEUE_SIZE = 100;
28
+ const REQUEST_TIMEOUT_MS = 10000;
29
+ const MAX_RETRIES = 3;
30
+ const RETRY_DELAYS_MS = [1000, 2000, 4000]; // Exponential backoff
31
+ const MAX_FORWARDS_PER_SECOND = 50;
32
+ class TraceForwarder {
33
+ constructor(config) {
34
+ this.queue = [];
35
+ this.stats = { sent: 0, failed: 0, buffered: 0 };
36
+ this.isStopped = false;
37
+ this.processingPromise = null;
38
+ this.forwardCount = 0;
39
+ this.forwardWindowStart = Date.now();
40
+ if (!config.apiKey || !config.baseUrl || !config.appId) {
41
+ throw new Error('Invalid forwarding config: missing required fields');
42
+ }
43
+ this.config = config;
44
+ }
45
+ /**
46
+ * Enqueues a trace payload for forwarding.
47
+ * Drops oldest trace if queue is full.
48
+ * Never throws — forwarding failures are non-fatal by design.
49
+ */
50
+ enqueue(payload) {
51
+ try {
52
+ if (this.isStopped) {
53
+ return;
54
+ }
55
+ // Check rate limit
56
+ if (!this.checkRateLimit()) {
57
+ console.warn('[trace-forward] ⚠️ Rate limit exceeded, buffering trace');
58
+ }
59
+ // Add to queue
60
+ this.queue.push(payload);
61
+ // Drop oldest if queue exceeds max size
62
+ if (this.queue.length > MAX_QUEUE_SIZE) {
63
+ this.queue.shift();
64
+ console.warn('[trace-forward] ⚠️ Queue full, dropped oldest trace');
65
+ }
66
+ this.stats.buffered = this.queue.length;
67
+ // Start processing if not already running
68
+ if (!this.processingPromise) {
69
+ this.processingPromise = this.processQueue();
70
+ }
71
+ }
72
+ catch (_a) {
73
+ // Silently drop — caller (API server) must never be affected by forwarding issues
74
+ }
75
+ }
76
+ /**
77
+ * Checks if we're within the rate limit.
78
+ * Resets the window every second.
79
+ */
80
+ checkRateLimit() {
81
+ const now = Date.now();
82
+ const elapsed = now - this.forwardWindowStart;
83
+ // Reset window every second
84
+ if (elapsed >= 1000) {
85
+ this.forwardCount = 0;
86
+ this.forwardWindowStart = now;
87
+ }
88
+ return this.forwardCount < MAX_FORWARDS_PER_SECOND;
89
+ }
90
+ /**
91
+ * Processes queued traces asynchronously.
92
+ */
93
+ processQueue() {
94
+ return __awaiter(this, void 0, void 0, function* () {
95
+ while (this.queue.length > 0 && !this.isStopped) {
96
+ const payload = this.queue.shift();
97
+ if (!payload)
98
+ break;
99
+ this.stats.buffered = this.queue.length;
100
+ // Check rate limit before forwarding
101
+ while (!this.checkRateLimit()) {
102
+ yield sleep(100); // Wait briefly before retrying
103
+ }
104
+ const success = yield this.forwardWithRetry(payload);
105
+ if (success) {
106
+ this.stats.sent++;
107
+ this.forwardCount++;
108
+ }
109
+ else {
110
+ this.stats.failed++;
111
+ }
112
+ }
113
+ this.processingPromise = null;
114
+ });
115
+ }
116
+ /**
117
+ * Forwards a single trace with retry logic.
118
+ */
119
+ forwardWithRetry(payload) {
120
+ return __awaiter(this, void 0, void 0, function* () {
121
+ for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
122
+ const result = yield this.forwardOnce(payload);
123
+ if (result.success) {
124
+ return true;
125
+ }
126
+ // Stop forwarding on 401 (auth failure)
127
+ if (result.status === 401) {
128
+ console.error('[trace-forward] ✗ Auth expired. Run \'agentmark login\' to re-authenticate.');
129
+ this.stop();
130
+ return false;
131
+ }
132
+ // Respect Retry-After on 429
133
+ if (result.status === 429 && result.retryAfter) {
134
+ const delay = result.retryAfter * 1000;
135
+ console.warn(`[trace-forward] ⚠️ Rate limited, retrying after ${result.retryAfter}s`);
136
+ yield sleep(delay);
137
+ continue;
138
+ }
139
+ // Retry on network error or 5xx
140
+ if (attempt < MAX_RETRIES) {
141
+ const delay = RETRY_DELAYS_MS[attempt];
142
+ yield sleep(delay);
143
+ continue;
144
+ }
145
+ // All retries exhausted
146
+ console.error(`[trace-forward] ✗ Failed to forward trace after ${MAX_RETRIES + 1} attempts`);
147
+ return false;
148
+ }
149
+ return false;
150
+ });
151
+ }
152
+ /**
153
+ * Attempts to forward a trace once.
154
+ */
155
+ forwardOnce(payload) {
156
+ return __awaiter(this, void 0, void 0, function* () {
157
+ try {
158
+ const controller = new AbortController();
159
+ const timeoutId = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
160
+ const response = yield fetch(`${this.config.baseUrl}/v1/traces`, {
161
+ method: 'POST',
162
+ headers: {
163
+ 'Content-Type': 'application/json',
164
+ Authorization: this.config.apiKey,
165
+ 'X-Agentmark-App-Id': this.config.appId,
166
+ },
167
+ body: JSON.stringify(payload),
168
+ signal: controller.signal,
169
+ });
170
+ clearTimeout(timeoutId);
171
+ if (response.ok || response.status === 202) {
172
+ return { success: true };
173
+ }
174
+ // Extract Retry-After header for 429
175
+ let retryAfter;
176
+ if (response.status === 429) {
177
+ const retryAfterHeader = response.headers.get('Retry-After');
178
+ if (retryAfterHeader) {
179
+ retryAfter = parseInt(retryAfterHeader, 10);
180
+ }
181
+ }
182
+ return { success: false, status: response.status, retryAfter };
183
+ }
184
+ catch (error) {
185
+ // Network error or timeout
186
+ return { success: false };
187
+ }
188
+ });
189
+ }
190
+ /**
191
+ * Flushes all buffered traces with a timeout.
192
+ * Returns the number of traces that could not be flushed.
193
+ */
194
+ flush() {
195
+ return __awaiter(this, arguments, void 0, function* (timeoutMs = 5000) {
196
+ const startTime = Date.now();
197
+ // Wait for current processing to finish or timeout
198
+ while (this.queue.length > 0 && Date.now() - startTime < timeoutMs) {
199
+ yield sleep(100);
200
+ }
201
+ return this.queue.length;
202
+ });
203
+ }
204
+ /**
205
+ * Stops the forwarder.
206
+ * No more traces will be accepted after calling stop().
207
+ */
208
+ stop() {
209
+ this.isStopped = true;
210
+ }
211
+ /**
212
+ * Returns current forwarding statistics.
213
+ */
214
+ getStats() {
215
+ return Object.assign({}, this.stats);
216
+ }
217
+ }
218
+ exports.TraceForwarder = TraceForwarder;
219
+ /**
220
+ * Sleep helper for retry delays.
221
+ */
222
+ function sleep(ms) {
223
+ return new Promise((resolve) => setTimeout(resolve, ms));
224
+ }
225
+ //# sourceMappingURL=forwarder.js.map