@alwaysmeticulous/client 2.307.0 → 2.311.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 (33) hide show
  1. package/dist/api/__tests__/agent.api.spec.js +89 -2
  2. package/dist/api/__tests__/agent.api.spec.js.map +1 -1
  3. package/dist/api/agent.api.d.ts +112 -2
  4. package/dist/api/agent.api.d.ts.map +1 -1
  5. package/dist/api/agent.api.js +76 -7
  6. package/dist/api/agent.api.js.map +1 -1
  7. package/dist/api/agentic-session-generation.api.d.ts +222 -0
  8. package/dist/api/agentic-session-generation.api.d.ts.map +1 -0
  9. package/dist/api/agentic-session-generation.api.js +109 -0
  10. package/dist/api/agentic-session-generation.api.js.map +1 -0
  11. package/dist/api/project-deployments.api.d.ts +21 -0
  12. package/dist/api/project-deployments.api.d.ts.map +1 -1
  13. package/dist/api/project-deployments.api.js +15 -14
  14. package/dist/api/project-deployments.api.js.map +1 -1
  15. package/dist/index.d.ts +3 -1
  16. package/dist/index.d.ts.map +1 -1
  17. package/dist/index.js +20 -4
  18. package/dist/index.js.map +1 -1
  19. package/dist/oauth/__tests__/oauth-device-login.spec.d.ts +2 -0
  20. package/dist/oauth/__tests__/oauth-device-login.spec.d.ts.map +1 -0
  21. package/dist/oauth/__tests__/oauth-device-login.spec.js +310 -0
  22. package/dist/oauth/__tests__/oauth-device-login.spec.js.map +1 -0
  23. package/dist/oauth/oauth-constants.d.ts +1 -0
  24. package/dist/oauth/oauth-constants.d.ts.map +1 -1
  25. package/dist/oauth/oauth-constants.js +23 -9
  26. package/dist/oauth/oauth-constants.js.map +1 -1
  27. package/dist/oauth/oauth-device-login.d.ts +3 -0
  28. package/dist/oauth/oauth-device-login.d.ts.map +1 -0
  29. package/dist/oauth/oauth-device-login.js +169 -0
  30. package/dist/oauth/oauth-device-login.js.map +1 -0
  31. package/dist/version.d.ts +1 -1
  32. package/dist/version.js +1 -1
  33. package/package.json +3 -3
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+ !function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="c23e572f-3089-543e-a18d-04649f6856ee")}catch(e){}}();
3
+
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.performDeviceLogin = void 0;
6
+ const common_1 = require("@alwaysmeticulous/common");
7
+ const oauth_constants_1 = require("./oauth-constants");
8
+ const oauth_pkce_1 = require("./oauth-pkce");
9
+ const oauth_token_store_1 = require("./oauth-token-store");
10
+ const DEFAULT_POLL_INTERVAL_SECONDS = 5;
11
+ const SLOW_DOWN_INCREMENT_SECONDS = 5;
12
+ const performDeviceLogin = async () => {
13
+ const logger = (0, common_1.initLogger)();
14
+ // PKCE binds the token poll to this process: Keycloak enforces the client's
15
+ // PKCE policy on the device authorization endpoint too.
16
+ const codeVerifier = (0, oauth_pkce_1.generateCodeVerifier)();
17
+ const authorization = await requestDeviceAuthorization({
18
+ codeChallenge: (0, oauth_pkce_1.generateCodeChallenge)(codeVerifier),
19
+ });
20
+ const webappBaseUrl = (0, oauth_constants_1.getWebappBaseUrl)();
21
+ const cliLoginParams = new URLSearchParams({
22
+ user_code: authorization.user_code,
23
+ issuer: oauth_constants_1.KEYCLOAK_ISSUER_URL,
24
+ });
25
+ logger.info(`On any device, open: ${webappBaseUrl}/cli-device-login?${cliLoginParams.toString()} ` +
26
+ `and confirm the code: ${authorization.user_code}`);
27
+ logger.info(authorization.verification_uri_complete
28
+ ? `If that doesn't work, open ${authorization.verification_uri_complete}`
29
+ : `If that doesn't work, open ${authorization.verification_uri} and enter the code manually: ${authorization.user_code}`);
30
+ const tokens = await pollForTokens({ authorization, codeVerifier });
31
+ (0, oauth_token_store_1.storeOAuthTokens)(tokens);
32
+ logger.info("Authentication successful.");
33
+ return tokens;
34
+ };
35
+ exports.performDeviceLogin = performDeviceLogin;
36
+ const requestDeviceAuthorization = async ({ codeChallenge, }) => {
37
+ const deviceAuthorizationEndpoint = await (0, oauth_constants_1.getDeviceAuthorizationEndpoint)();
38
+ const body = new URLSearchParams({
39
+ client_id: oauth_constants_1.CLI_CLIENT_ID,
40
+ scope: oauth_constants_1.OAUTH_SCOPES,
41
+ code_challenge: codeChallenge,
42
+ code_challenge_method: "S256",
43
+ });
44
+ const response = await fetch(deviceAuthorizationEndpoint, {
45
+ method: "POST",
46
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
47
+ body: body.toString(),
48
+ });
49
+ const bodyText = await response.text();
50
+ if (!response.ok) {
51
+ // Discovery advertises `device_authorization_endpoint` at the realm level
52
+ // regardless of whether the grant is enabled on this specific client, so
53
+ // disabling it only on `meticulous-cli` isn't caught by
54
+ // `getDeviceAuthorizationEndpoint()`. Keycloak instead rejects the request
55
+ // itself with `unauthorized_client` — catch that here for the same clear
56
+ // message.
57
+ if (parseOAuthErrorCode(bodyText) === "unauthorized_client") {
58
+ throw new Error("The OAuth 2.0 Device Authorization Grant is not enabled for the " +
59
+ `meticulous-cli client on this realm (${oauth_constants_1.KEYCLOAK_ISSUER_URL}).`);
60
+ }
61
+ throw new Error(`Device authorization request failed: ${response.status} ${bodyText}`);
62
+ }
63
+ return parseDeviceAuthorizationResponse(bodyText);
64
+ };
65
+ const REQUIRED_DEVICE_AUTHORIZATION_STRING_FIELDS = [
66
+ "device_code",
67
+ "user_code",
68
+ "verification_uri",
69
+ ];
70
+ const parseDeviceAuthorizationResponse = (bodyText) => {
71
+ const data = JSON.parse(bodyText);
72
+ for (const field of REQUIRED_DEVICE_AUTHORIZATION_STRING_FIELDS) {
73
+ if (typeof data[field] !== "string" || data[field].length === 0) {
74
+ throw new Error(`Device authorization response missing required field "${field}".`);
75
+ }
76
+ }
77
+ if (typeof data.expires_in !== "number" ||
78
+ !Number.isFinite(data.expires_in)) {
79
+ throw new Error('Device authorization response missing a valid "expires_in".');
80
+ }
81
+ return data;
82
+ };
83
+ const pollForTokens = async ({ authorization, codeVerifier, }) => {
84
+ const tokenEndpoint = await (0, oauth_constants_1.getTokenEndpoint)();
85
+ const deadline = Date.now() + authorization.expires_in * 1000;
86
+ let intervalSeconds = authorization.interval ?? DEFAULT_POLL_INTERVAL_SECONDS;
87
+ for (;;) {
88
+ const remainingMs = deadline - Date.now();
89
+ if (remainingMs <= 0) {
90
+ throw new Error("Device code expired, run login again.");
91
+ }
92
+ // Cap the sleep to the remaining lifetime so a final token request still
93
+ // fires before the local deadline, instead of giving up one interval early.
94
+ await sleep(Math.min(intervalSeconds * 1000, remainingMs));
95
+ const result = await requestDeviceToken({
96
+ tokenEndpoint,
97
+ deviceCode: authorization.device_code,
98
+ codeVerifier,
99
+ });
100
+ if (result.kind === "success") {
101
+ return result.tokens;
102
+ }
103
+ if (result.kind === "slow_down") {
104
+ intervalSeconds += SLOW_DOWN_INCREMENT_SECONDS;
105
+ }
106
+ }
107
+ };
108
+ const requestDeviceToken = async ({ tokenEndpoint, deviceCode, codeVerifier, }) => {
109
+ const body = new URLSearchParams({
110
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
111
+ device_code: deviceCode,
112
+ client_id: oauth_constants_1.CLI_CLIENT_ID,
113
+ code_verifier: codeVerifier,
114
+ });
115
+ let response;
116
+ let bodyText;
117
+ try {
118
+ response = await fetch(tokenEndpoint, {
119
+ method: "POST",
120
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
121
+ body: body.toString(),
122
+ });
123
+ bodyText = await response.text();
124
+ }
125
+ catch {
126
+ // Transient network blip: keep polling until the local deadline instead
127
+ // of aborting an otherwise-valid, in-progress login.
128
+ return { kind: "pending" };
129
+ }
130
+ if (response.ok) {
131
+ const data = JSON.parse(bodyText);
132
+ return { kind: "success", tokens: mapTokenResponse(data) };
133
+ }
134
+ if (response.status >= 500) {
135
+ // Transient server error (5xx): same reasoning as the network-error case.
136
+ return { kind: "pending" };
137
+ }
138
+ const errorCode = parseOAuthErrorCode(bodyText);
139
+ if (errorCode === "authorization_pending") {
140
+ return { kind: "pending" };
141
+ }
142
+ if (errorCode === "slow_down") {
143
+ return { kind: "slow_down" };
144
+ }
145
+ if (errorCode === "access_denied") {
146
+ throw new Error("Login was denied.");
147
+ }
148
+ if (errorCode === "expired_token") {
149
+ throw new Error("Device code expired, run login again.");
150
+ }
151
+ throw new Error(`Device token request failed: ${response.status} ${bodyText}`);
152
+ };
153
+ const parseOAuthErrorCode = (bodyText) => {
154
+ try {
155
+ return JSON.parse(bodyText).error;
156
+ }
157
+ catch {
158
+ return undefined;
159
+ }
160
+ };
161
+ const mapTokenResponse = (data) => ({
162
+ accessToken: data.access_token,
163
+ refreshToken: data.refresh_token,
164
+ expiresAt: Math.floor(Date.now() / 1000) + data.expires_in,
165
+ idToken: data.id_token,
166
+ });
167
+ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
168
+ //# sourceMappingURL=oauth-device-login.js.map
169
+ //# debugId=c23e572f-3089-543e-a18d-04649f6856ee
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-device-login.js","sources":["../../src/oauth/oauth-device-login.ts"],"sourceRoot":"","names":[],"mappings":"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","debugId":"c23e572f-3089-543e-a18d-04649f6856ee"}
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "2.307.0";
1
+ export declare const VERSION = "2.311.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -5,6 +5,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.VERSION = void 0;
6
6
  // AUTO-GENERATED by scripts/generate-version.mjs — do not edit by hand.
7
7
  // Regenerated from package.json on every build.
8
- exports.VERSION = "2.307.0";
8
+ exports.VERSION = "2.311.0";
9
9
  //# sourceMappingURL=version.js.map
10
10
  //# debugId=ac10f4cc-7a38-5615-8b9d-956b50ad79da
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alwaysmeticulous/client",
3
- "version": "2.307.0",
3
+ "version": "2.311.0",
4
4
  "description": "Helper methods for using the Meticulous backend API",
5
5
  "license": "ISC",
6
6
  "main": "dist/index.js",
@@ -12,8 +12,8 @@
12
12
  "loglevel": "^1.8.0",
13
13
  "proxy-agent": "^6.4.0",
14
14
  "undici": "^6.24.1",
15
- "@alwaysmeticulous/api": "2.307.0",
16
- "@alwaysmeticulous/common": "2.301.0"
15
+ "@alwaysmeticulous/common": "2.310.0",
16
+ "@alwaysmeticulous/api": "2.310.0"
17
17
  },
18
18
  "author": {
19
19
  "name": "The Meticulous Team",