@knpkv/atlassian-common 0.2.0 → 0.4.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 (80) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +25 -10
  3. package/dist/Brand.d.ts +15 -15
  4. package/dist/Brand.d.ts.map +1 -1
  5. package/dist/Brand.js +5 -5
  6. package/dist/Brand.js.map +1 -1
  7. package/dist/Hash.d.ts +12 -14
  8. package/dist/Hash.d.ts.map +1 -1
  9. package/dist/Hash.js +18 -24
  10. package/dist/Hash.js.map +1 -1
  11. package/dist/ast/BlockNode.d.ts +120 -177
  12. package/dist/ast/BlockNode.d.ts.map +1 -1
  13. package/dist/ast/BlockNode.js +28 -8
  14. package/dist/ast/BlockNode.js.map +1 -1
  15. package/dist/ast/Document.d.ts +114 -156
  16. package/dist/ast/Document.d.ts.map +1 -1
  17. package/dist/ast/Document.js +1 -1
  18. package/dist/ast/Document.js.map +1 -1
  19. package/dist/ast/InlineNode.d.ts +59 -247
  20. package/dist/ast/InlineNode.d.ts.map +1 -1
  21. package/dist/ast/InlineNode.js +28 -3
  22. package/dist/ast/InlineNode.js.map +1 -1
  23. package/dist/ast/MacroNode.d.ts +62 -102
  24. package/dist/ast/MacroNode.d.ts.map +1 -1
  25. package/dist/ast/MacroNode.js +12 -5
  26. package/dist/ast/MacroNode.js.map +1 -1
  27. package/dist/auth/OAuthOperations.d.ts +1 -1
  28. package/dist/auth/OAuthOperations.d.ts.map +1 -1
  29. package/dist/auth/OAuthOperations.js +5 -6
  30. package/dist/auth/OAuthOperations.js.map +1 -1
  31. package/dist/auth/OAuthResponseSchemas.d.ts +13 -13
  32. package/dist/bin.d.ts +3 -0
  33. package/dist/bin.d.ts.map +1 -0
  34. package/dist/bin.js +58 -0
  35. package/dist/bin.js.map +1 -0
  36. package/dist/config/AuthProfiles.d.ts +342 -0
  37. package/dist/config/AuthProfiles.d.ts.map +1 -0
  38. package/dist/config/AuthProfiles.js +275 -0
  39. package/dist/config/AuthProfiles.js.map +1 -0
  40. package/dist/config/ConfigPaths.d.ts +12 -26
  41. package/dist/config/ConfigPaths.d.ts.map +1 -1
  42. package/dist/config/ConfigPaths.js +33 -3
  43. package/dist/config/ConfigPaths.js.map +1 -1
  44. package/dist/config/OAuthSchemas.d.ts +24 -24
  45. package/dist/config/ProfileManager.d.ts +92 -0
  46. package/dist/config/ProfileManager.d.ts.map +1 -0
  47. package/dist/config/ProfileManager.js +175 -0
  48. package/dist/config/ProfileManager.js.map +1 -0
  49. package/dist/config/TokenStorage.d.ts +5 -24
  50. package/dist/config/TokenStorage.d.ts.map +1 -1
  51. package/dist/config/TokenStorage.js +35 -22
  52. package/dist/config/TokenStorage.js.map +1 -1
  53. package/dist/config/index.d.ts +3 -1
  54. package/dist/config/index.d.ts.map +1 -1
  55. package/dist/config/index.js +5 -1
  56. package/dist/config/index.js.map +1 -1
  57. package/dist/index.d.ts +1 -1
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/index.js +1 -1
  60. package/dist/index.js.map +1 -1
  61. package/package.json +17 -11
  62. package/src/Brand.ts +5 -17
  63. package/src/Hash.ts +27 -27
  64. package/src/ast/BlockNode.ts +13 -13
  65. package/src/ast/Document.ts +1 -1
  66. package/src/ast/InlineNode.ts +5 -5
  67. package/src/ast/MacroNode.ts +7 -6
  68. package/src/auth/OAuthOperations.ts +5 -6
  69. package/src/bin.ts +115 -0
  70. package/src/config/AuthProfiles.ts +384 -0
  71. package/src/config/ConfigPaths.ts +21 -7
  72. package/src/config/ProfileManager.ts +268 -0
  73. package/src/config/TokenStorage.ts +23 -27
  74. package/src/config/index.ts +42 -0
  75. package/src/index.ts +1 -1
  76. package/test/AuthProfiles.test.ts +131 -0
  77. package/test/Hash.test.ts +52 -0
  78. package/test/OAuthOperations.test.ts +2 -3
  79. package/test/ProfileManager.test.ts +188 -0
  80. package/tsconfig.tsbuildinfo +1 -1
@@ -1,29 +1,9 @@
1
- /**
2
- * XDG-compliant config path resolution and secure file I/O for Atlassian tools.
3
- *
4
- * **Mental model**
5
- *
6
- * - **Injectable home directory**: {@link HomeDirectoryTag} is an Effect service so tests
7
- * can substitute a temp dir without touching env vars. {@link HomeDirectoryLive} reads
8
- * `HOME` / `USERPROFILE` via Effect `Config`.
9
- * - **XDG hierarchy**: `~/.config/atlassian/<toolName>/` — respects `XDG_CONFIG_HOME` override.
10
- * - **Secure by default**: {@link ensureConfigDir} creates dirs at `0o700`;
11
- * {@link writeSecureFile} writes at `0o600`.
12
- *
13
- * **Common tasks**
14
- *
15
- * - Resolve config dir: {@link getConfigDir}
16
- * - Get auth file path: {@link getAuthPath}
17
- * - Write credential files: {@link writeSecureFile}
18
- *
19
- * @module
20
- */
21
- import type * as Error from "@effect/platform/Error";
22
- import * as FileSystem from "@effect/platform/FileSystem";
23
- import * as Path from "@effect/platform/Path";
24
1
  import * as Context from "effect/Context";
25
2
  import * as Effect from "effect/Effect";
3
+ import * as FileSystem from "effect/FileSystem";
26
4
  import * as Layer from "effect/Layer";
5
+ import * as Path from "effect/Path";
6
+ import type * as PlatformError from "effect/PlatformError";
27
7
  declare const HomeDirectoryError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
28
8
  readonly _tag: "HomeDirectoryError";
29
9
  } & Readonly<A>;
@@ -46,7 +26,7 @@ export declare class HomeDirectoryError extends HomeDirectoryError_base<{
46
26
  export interface HomeDirectory {
47
27
  readonly get: () => Effect.Effect<string, HomeDirectoryError>;
48
28
  }
49
- declare const HomeDirectoryTag_base: Context.TagClass<HomeDirectoryTag, "@knpkv/atlassian-common/HomeDirectory", HomeDirectory>;
29
+ declare const HomeDirectoryTag_base: Context.ServiceClass<HomeDirectoryTag, "@knpkv/atlassian-common/HomeDirectory", HomeDirectory>;
50
30
  /**
51
31
  * Tag for the HomeDirectory service.
52
32
  *
@@ -79,17 +59,23 @@ export declare const getAuthPath: (toolName: string) => Effect.Effect<string, Ho
79
59
  * @category Utilities
80
60
  */
81
61
  export declare const getOAuthConfigPath: (toolName: string) => Effect.Effect<string, HomeDirectoryError, HomeDirectoryTag | Path.Path>;
62
+ /**
63
+ * Get auth profiles file path for a specific tool.
64
+ *
65
+ * @category Utilities
66
+ */
67
+ export declare const getProfilesPath: (toolName: string) => Effect.Effect<string, HomeDirectoryError, HomeDirectoryTag | Path.Path>;
82
68
  /**
83
69
  * Ensure config directory exists with secure permissions.
84
70
  *
85
71
  * @category Utilities
86
72
  */
87
- export declare const ensureConfigDir: (toolName: string) => Effect.Effect<string, HomeDirectoryError | Error.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
73
+ export declare const ensureConfigDir: (toolName: string) => Effect.Effect<string, HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
88
74
  /**
89
75
  * Write file with secure permissions (600).
90
76
  *
91
77
  * @category Utilities
92
78
  */
93
- export declare const writeSecureFile: (filePath: string, content: string) => Effect.Effect<void, Error.PlatformError, FileSystem.FileSystem>;
79
+ export declare const writeSecureFile: (filePath: string, content: string) => Effect.Effect<void, PlatformError.PlatformError, FileSystem.FileSystem>;
94
80
  export {};
95
81
  //# sourceMappingURL=ConfigPaths.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigPaths.d.ts","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,IAAI,MAAM,uBAAuB,CAAA;AAE7C,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;;;;AAGrC;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,wBAAuC;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;CAC9D;;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,qBAGnC;CAAG;AAMN;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAY3D,CAAA;AAID;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,WAAW,MAAM,KAChB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAYrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAKrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAKrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CACd,MAAM,EACN,kBAAkB,GAAG,KAAK,CAAC,aAAa,EACxC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAYlD,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,UAAU,CAAC,UAAU,CAQ7D,CAAA"}
1
+ {"version":3,"file":"ConfigPaths.d.ts","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,OAAO,KAAK,IAAI,MAAM,aAAa,CAAA;AACnC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;;;;AAE1D;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,wBAAuC;IAC7E,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAA;CAC9D;;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,qBAGM;CAAG;AAM/C;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAY3D,CAAA;AAID;;;;;GAKG;AACH,eAAO,MAAM,YAAY,GACvB,WAAW,MAAM,KAChB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAYrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAKrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAC7B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAKrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,kBAAkB,EAAE,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAKrE,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CACd,MAAM,EACN,kBAAkB,GAAG,aAAa,CAAC,aAAa,EAChD,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAYlD,CAAA;AAEJ;;;;GAIG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,SAAS,MAAM,KACd,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,aAAa,CAAC,aAAa,EAAE,UAAU,CAAC,UAAU,CAQrE,CAAA"}
@@ -1,11 +1,31 @@
1
- import * as FileSystem from "@effect/platform/FileSystem";
2
- import * as Path from "@effect/platform/Path";
1
+ /**
2
+ * XDG-compliant config path resolution and secure file I/O for Atlassian tools.
3
+ *
4
+ * **Mental model**
5
+ *
6
+ * - **Injectable home directory**: {@link HomeDirectoryTag} is an Effect service so tests
7
+ * can substitute a temp dir without touching env vars. {@link HomeDirectoryLive} reads
8
+ * `HOME` / `USERPROFILE` via Effect `Config`.
9
+ * - **XDG hierarchy**: `~/.config/atlassian/<toolName>/` — respects `XDG_CONFIG_HOME` override.
10
+ * - **Secure by default**: {@link ensureConfigDir} creates dirs at `0o700`;
11
+ * {@link writeSecureFile} writes at `0o600`.
12
+ *
13
+ * **Common tasks**
14
+ *
15
+ * - Resolve config dir: {@link getConfigDir}
16
+ * - Get auth file path: {@link getAuthPath}
17
+ * - Write credential files: {@link writeSecureFile}
18
+ *
19
+ * @module
20
+ */
3
21
  import * as Config from "effect/Config";
4
22
  import * as Context from "effect/Context";
5
23
  import * as Data from "effect/Data";
6
24
  import * as Effect from "effect/Effect";
25
+ import * as FileSystem from "effect/FileSystem";
7
26
  import * as Layer from "effect/Layer";
8
27
  import * as Option from "effect/Option";
28
+ import * as Path from "effect/Path";
9
29
  /**
10
30
  * Error when home directory cannot be determined.
11
31
  *
@@ -21,7 +41,7 @@ export class HomeDirectoryError extends Data.TaggedError("HomeDirectoryError") {
21
41
  *
22
42
  * @category Services
23
43
  */
24
- export class HomeDirectoryTag extends Context.Tag("@knpkv/atlassian-common/HomeDirectory")() {
44
+ export class HomeDirectoryTag extends Context.Service()("@knpkv/atlassian-common/HomeDirectory") {
25
45
  }
26
46
  const HomeConfig = Config.option(Config.string("HOME")).pipe(Config.orElse(() => Config.option(Config.string("USERPROFILE"))));
27
47
  /**
@@ -75,6 +95,16 @@ export const getOAuthConfigPath = (toolName) => Effect.gen(function* () {
75
95
  const configDir = yield* getConfigDir(toolName);
76
96
  return path.join(configDir, "oauth.json");
77
97
  });
98
+ /**
99
+ * Get auth profiles file path for a specific tool.
100
+ *
101
+ * @category Utilities
102
+ */
103
+ export const getProfilesPath = (toolName) => Effect.gen(function* () {
104
+ const path = yield* Path.Path;
105
+ const configDir = yield* getConfigDir(toolName);
106
+ return path.join(configDir, "profiles.json");
107
+ });
78
108
  /**
79
109
  * Ensure config directory exists with secure permissions.
80
110
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ConfigPaths.js","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConfigPaths.js","sourceRoot":"","sources":["../../src/config/ConfigPaths.ts"],"names":[],"mappings":"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"}
@@ -19,11 +19,11 @@ import * as Schema from "effect/Schema";
19
19
  */
20
20
  export declare const OAuthUserSchema: Schema.Struct<{
21
21
  /** Atlassian account ID */
22
- account_id: typeof Schema.String;
22
+ readonly account_id: Schema.String;
23
23
  /** Display name */
24
- name: typeof Schema.String;
24
+ readonly name: Schema.String;
25
25
  /** Email address */
26
- email: typeof Schema.String;
26
+ readonly email: Schema.String;
27
27
  }>;
28
28
  /**
29
29
  * Type for OAuth user info.
@@ -53,25 +53,25 @@ export type OAuthUser = Schema.Schema.Type<typeof OAuthUserSchema>;
53
53
  */
54
54
  export declare const OAuthTokenSchema: Schema.Struct<{
55
55
  /** OAuth access token */
56
- access_token: typeof Schema.String;
56
+ readonly access_token: Schema.String;
57
57
  /** OAuth refresh token */
58
- refresh_token: typeof Schema.String;
58
+ readonly refresh_token: Schema.String;
59
59
  /** Token expiration timestamp (Unix ms) */
60
- expires_at: typeof Schema.Number;
60
+ readonly expires_at: Schema.Number;
61
61
  /** Granted scopes */
62
- scope: typeof Schema.String;
62
+ readonly scope: Schema.String;
63
63
  /** Atlassian Cloud site ID */
64
- cloud_id: typeof Schema.String;
64
+ readonly cloud_id: Schema.String;
65
65
  /** Site URL */
66
- site_url: typeof Schema.String;
66
+ readonly site_url: Schema.String;
67
67
  /** Cached user info */
68
- user: Schema.optional<Schema.Struct<{
68
+ readonly user: Schema.optional<Schema.Struct<{
69
69
  /** Atlassian account ID */
70
- account_id: typeof Schema.String;
70
+ readonly account_id: Schema.String;
71
71
  /** Display name */
72
- name: typeof Schema.String;
72
+ readonly name: Schema.String;
73
73
  /** Email address */
74
- email: typeof Schema.String;
74
+ readonly email: Schema.String;
75
75
  }>>;
76
76
  }>;
77
77
  /**
@@ -87,9 +87,9 @@ export type OAuthToken = Schema.Schema.Type<typeof OAuthTokenSchema>;
87
87
  */
88
88
  export declare const OAuthConfigSchema: Schema.Struct<{
89
89
  /** OAuth client ID from Atlassian Developer Console */
90
- clientId: typeof Schema.String;
90
+ readonly clientId: Schema.String;
91
91
  /** OAuth client secret */
92
- clientSecret: typeof Schema.String;
92
+ readonly clientSecret: Schema.String;
93
93
  }>;
94
94
  /**
95
95
  * Type for OAuth client configuration.
@@ -104,15 +104,15 @@ export type OAuthConfig = Schema.Schema.Type<typeof OAuthConfigSchema>;
104
104
  */
105
105
  export declare const AtlassianSiteSchema: Schema.Struct<{
106
106
  /** Cloud ID */
107
- id: typeof Schema.String;
107
+ readonly id: Schema.String;
108
108
  /** Site name */
109
- name: typeof Schema.String;
109
+ readonly name: Schema.String;
110
110
  /** Site URL */
111
- url: typeof Schema.String;
111
+ readonly url: Schema.String;
112
112
  /** Available scopes */
113
- scopes: Schema.Array$<typeof Schema.String>;
113
+ readonly scopes: Schema.$Array<Schema.String>;
114
114
  /** Avatar URL */
115
- avatarUrl: Schema.optional<typeof Schema.String>;
115
+ readonly avatarUrl: Schema.optional<Schema.String>;
116
116
  }>;
117
117
  /**
118
118
  * Type for Atlassian Cloud site.
@@ -127,13 +127,13 @@ export type AtlassianSite = Schema.Schema.Type<typeof AtlassianSiteSchema>;
127
127
  */
128
128
  export declare const AtlassianUserSchema: Schema.Struct<{
129
129
  /** Atlassian account ID */
130
- accountId: typeof Schema.String;
130
+ readonly accountId: Schema.String;
131
131
  /** Display name */
132
- displayName: typeof Schema.String;
132
+ readonly displayName: Schema.String;
133
133
  /** Email address (may be empty for privacy) */
134
- email: Schema.optional<typeof Schema.String>;
134
+ readonly email: Schema.optional<Schema.String>;
135
135
  /** Public name */
136
- publicName: Schema.optional<typeof Schema.String>;
136
+ readonly publicName: Schema.optional<Schema.String>;
137
137
  }>;
138
138
  /**
139
139
  * Type for Atlassian user profile.
@@ -0,0 +1,92 @@
1
+ import * as Effect from "effect/Effect";
2
+ import * as FileSystem from "effect/FileSystem";
3
+ import * as Path from "effect/Path";
4
+ import type * as PlatformError from "effect/PlatformError";
5
+ import type { HttpClient } from "effect/unstable/http";
6
+ import type { OAuthError } from "../auth/OAuthErrors.js";
7
+ import { type AuthProfile } from "./AuthProfiles.js";
8
+ import { type HomeDirectoryError, HomeDirectoryTag } from "./ConfigPaths.js";
9
+ import { type OAuthToken } from "./OAuthSchemas.js";
10
+ import { FileSystemError } from "./TokenStorage.js";
11
+ export interface AtlassianToolDefinition {
12
+ readonly toolName: string;
13
+ readonly authStoreName?: string;
14
+ readonly legacyAuthPath?: ReadonlyArray<string>;
15
+ readonly label: string;
16
+ readonly loginHint: string;
17
+ readonly requiredScopes: ReadonlyArray<string>;
18
+ }
19
+ export declare const JIRA_REQUIRED_SCOPES: readonly ["read:jira-work", "write:jira-work", "manage:jira-project", "read:jira-user", "read:me", "offline_access"];
20
+ export declare const CONFLUENCE_REQUIRED_SCOPES: readonly ["read:page:confluence", "write:page:confluence", "delete:page:confluence", "read:me", "offline_access"];
21
+ export declare const ATLASSIAN_TOOLS: readonly [{
22
+ readonly toolName: "jira-cli";
23
+ readonly label: "Jira CLI";
24
+ readonly loginHint: "jira auth login";
25
+ readonly requiredScopes: readonly ["read:jira-work", "write:jira-work", "manage:jira-project", "read:jira-user", "read:me", "offline_access"];
26
+ }, {
27
+ readonly toolName: "confluence-to-markdown";
28
+ readonly legacyAuthPath: readonly [".confluence", "auth.json"];
29
+ readonly label: "Confluence to Markdown";
30
+ readonly loginHint: "confluence auth login";
31
+ readonly requiredScopes: readonly ["read:page:confluence", "write:page:confluence", "delete:page:confluence", "read:me", "offline_access"];
32
+ }, {
33
+ readonly toolName: "jira-clockify";
34
+ readonly authStoreName: "jira-cli";
35
+ readonly label: "Jira Clockify";
36
+ readonly loginHint: "jcf auth jira login";
37
+ readonly requiredScopes: readonly ["read:jira-work", "write:jira-work", "manage:jira-project", "read:jira-user", "read:me", "offline_access"];
38
+ }];
39
+ export type ProfileTokenStatus = "valid" | "expired";
40
+ declare const ProfileNotFoundError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
41
+ readonly _tag: "ProfileNotFoundError";
42
+ } & Readonly<A>;
43
+ export declare class ProfileNotFoundError extends ProfileNotFoundError_base<{
44
+ readonly selector: string;
45
+ }> {
46
+ get message(): string;
47
+ }
48
+ declare const MissingOAuthConfigError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
49
+ readonly _tag: "MissingOAuthConfigError";
50
+ } & Readonly<A>;
51
+ export declare class MissingOAuthConfigError extends MissingOAuthConfigError_base<{
52
+ readonly authStoreName: string;
53
+ readonly profileId: string;
54
+ }> {
55
+ get message(): string;
56
+ }
57
+ export interface ToolProfileStatus {
58
+ readonly tool: AtlassianToolDefinition;
59
+ readonly authStoreName: string;
60
+ readonly activeProfile: AuthProfile | null;
61
+ readonly profiles: ReadonlyArray<AuthProfile>;
62
+ readonly tokenStatus: ProfileTokenStatus | "missing";
63
+ readonly missingScopes: ReadonlyArray<string>;
64
+ readonly oauthConfigured: boolean;
65
+ }
66
+ export declare const tokenScopes: (token: OAuthToken) => ReadonlySet<string>;
67
+ export declare const missingScopes: (token: OAuthToken, requiredScopes: ReadonlyArray<string>) => ReadonlyArray<string>;
68
+ export declare const inspectToolProfiles: (tool: AtlassianToolDefinition) => Effect.Effect<ToolProfileStatus, FileSystemError | HomeDirectoryError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
69
+ export declare const inspectAllToolProfiles: (tools?: ReadonlyArray<AtlassianToolDefinition>) => Effect.Effect<ToolProfileStatus[], HomeDirectoryError | FileSystemError, HomeDirectoryTag | Path.Path | FileSystem.FileSystem>;
70
+ /**
71
+ * Switch matching existing profiles across auth stores.
72
+ *
73
+ * Fails when the selector is not present in any store so callers do not
74
+ * mistake an unchanged profile list for a successful switch.
75
+ */
76
+ export declare const useProfileForAllTools: (selector: string, tools?: ReadonlyArray<AtlassianToolDefinition>) => Effect.Effect<ReadonlyArray<ToolProfileStatus>, ProfileNotFoundError | FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
77
+ /**
78
+ * Persist legacy single-token auth files into shared profile stores.
79
+ *
80
+ * Supports both XDG Atlassian auth files and tool-specific legacy paths such
81
+ * as Confluence's historical `~/.confluence/auth.json`.
82
+ */
83
+ export declare const migrateLegacyProfiles: (tools?: ReadonlyArray<AtlassianToolDefinition>) => Effect.Effect<ReadonlyArray<ToolProfileStatus>, FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
84
+ /**
85
+ * Refresh expired active profiles.
86
+ *
87
+ * Fails when an expired profile lacks OAuth client configuration so refresh
88
+ * callers cannot report success while leaving a token expired.
89
+ */
90
+ export declare const refreshActiveProfiles: (tools?: ReadonlyArray<AtlassianToolDefinition>) => Effect.Effect<ReadonlyArray<ToolProfileStatus>, MissingOAuthConfigError | OAuthError | FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag | HttpClient.HttpClient>;
91
+ export {};
92
+ //# sourceMappingURL=ProfileManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileManager.d.ts","sourceRoot":"","sources":["../../src/config/ProfileManager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * Unified Atlassian profile management helpers shared by Atlassian CLIs.
3
+ *
4
+ * @module
5
+ */
6
+ import * as Data from "effect/Data";
7
+ import * as Effect from "effect/Effect";
8
+ import * as FileSystem from "effect/FileSystem";
9
+ import * as Path from "effect/Path";
10
+ import * as Schema from "effect/Schema";
11
+ import { refreshToken } from "../auth/OAuthOperations.js";
12
+ import { findProfile, loadProfiles, saveProfiles, saveProfileToken } from "./AuthProfiles.js";
13
+ import { getProfilesPath, HomeDirectoryTag } from "./ConfigPaths.js";
14
+ import { OAuthTokenSchema } from "./OAuthSchemas.js";
15
+ import { FileSystemError, isTokenExpired, loadOAuthConfig } from "./TokenStorage.js";
16
+ export const JIRA_REQUIRED_SCOPES = [
17
+ "read:jira-work",
18
+ "write:jira-work",
19
+ "manage:jira-project",
20
+ "read:jira-user",
21
+ "read:me",
22
+ "offline_access"
23
+ ];
24
+ export const CONFLUENCE_REQUIRED_SCOPES = [
25
+ "read:page:confluence",
26
+ "write:page:confluence",
27
+ "delete:page:confluence",
28
+ "read:me",
29
+ "offline_access"
30
+ ];
31
+ export const ATLASSIAN_TOOLS = [
32
+ {
33
+ toolName: "jira-cli",
34
+ label: "Jira CLI",
35
+ loginHint: "jira auth login",
36
+ requiredScopes: JIRA_REQUIRED_SCOPES
37
+ },
38
+ {
39
+ toolName: "confluence-to-markdown",
40
+ legacyAuthPath: [".confluence", "auth.json"],
41
+ label: "Confluence to Markdown",
42
+ loginHint: "confluence auth login",
43
+ requiredScopes: CONFLUENCE_REQUIRED_SCOPES
44
+ },
45
+ {
46
+ toolName: "jira-clockify",
47
+ authStoreName: "jira-cli",
48
+ label: "Jira Clockify",
49
+ loginHint: "jcf auth jira login",
50
+ requiredScopes: JIRA_REQUIRED_SCOPES
51
+ }
52
+ ];
53
+ export class ProfileNotFoundError extends Data.TaggedError("ProfileNotFoundError") {
54
+ get message() {
55
+ return `Profile not found: ${this.selector}`;
56
+ }
57
+ }
58
+ export class MissingOAuthConfigError extends Data.TaggedError("MissingOAuthConfigError") {
59
+ get message() {
60
+ return `Cannot refresh expired profile ${this.profileId}: missing OAuth config for ${this.authStoreName}`;
61
+ }
62
+ }
63
+ const authStoreName = (tool) => tool.authStoreName ?? tool.toolName;
64
+ const uniqueAuthTools = (tools) => tools.filter((tool, index) => tools.findIndex((candidate) => authStoreName(candidate) === authStoreName(tool)) === index);
65
+ const loadLegacyToken = (tool) => Effect.gen(function* () {
66
+ if (!tool.legacyAuthPath)
67
+ return null;
68
+ const fs = yield* FileSystem.FileSystem;
69
+ const path = yield* Path.Path;
70
+ const homeDirectory = yield* HomeDirectoryTag;
71
+ const home = yield* homeDirectory.get();
72
+ const authPath = path.join(home, ...tool.legacyAuthPath);
73
+ const exists = yield* fs.exists(authPath).pipe(Effect.catch(() => Effect.succeed(false)));
74
+ if (!exists)
75
+ return null;
76
+ const content = yield* fs.readFileString(authPath).pipe(Effect.mapError((cause) => new FileSystemError({ operation: "read", path: authPath, cause })));
77
+ const parsed = yield* Effect.try({
78
+ try: () => JSON.parse(content),
79
+ catch: (cause) => cause
80
+ }).pipe(Effect.catch(() => Effect.succeed(null)));
81
+ if (parsed === null)
82
+ return null;
83
+ return yield* Schema.decodeUnknownEffect(OAuthTokenSchema)(parsed).pipe(Effect.catch(() => Effect.succeed(null)));
84
+ });
85
+ export const tokenScopes = (token) => new Set(token.scope.split(/\s+/).filter((scope) => scope.length > 0));
86
+ export const missingScopes = (token, requiredScopes) => {
87
+ const granted = tokenScopes(token);
88
+ return requiredScopes.filter((scope) => !granted.has(scope));
89
+ };
90
+ export const inspectToolProfiles = (tool) => Effect.gen(function* () {
91
+ const storeName = authStoreName(tool);
92
+ const [store, config] = yield* Effect.all([loadProfiles(storeName), loadOAuthConfig(storeName)]);
93
+ const activeProfile = store.profiles.find((profile) => profile.id === store.activeProfileId) ?? store.profiles[0] ??
94
+ null;
95
+ return {
96
+ tool,
97
+ authStoreName: storeName,
98
+ activeProfile,
99
+ profiles: store.profiles,
100
+ tokenStatus: activeProfile === null ? "missing" : isTokenExpired(activeProfile.token, 0) ? "expired" : "valid",
101
+ missingScopes: activeProfile === null ? [] : missingScopes(activeProfile.token, tool.requiredScopes),
102
+ oauthConfigured: config !== null
103
+ };
104
+ });
105
+ export const inspectAllToolProfiles = (tools = ATLASSIAN_TOOLS) => Effect.forEach(tools, inspectToolProfiles);
106
+ /**
107
+ * Switch matching existing profiles across auth stores.
108
+ *
109
+ * Fails when the selector is not present in any store so callers do not
110
+ * mistake an unchanged profile list for a successful switch.
111
+ */
112
+ export const useProfileForAllTools = (selector, tools = ATLASSIAN_TOOLS) => Effect.gen(function* () {
113
+ const authTools = uniqueAuthTools(tools);
114
+ const stores = yield* Effect.forEach(authTools, (tool) => loadProfiles(authStoreName(tool)).pipe(Effect.map((store) => [tool, store])));
115
+ const selected = stores.map(([, store]) => findProfile(store.profiles, selector)).find((profile) => profile !== null);
116
+ if (!selected)
117
+ return yield* Effect.fail(new ProfileNotFoundError({ selector }));
118
+ yield* Effect.forEach(stores, ([tool, store]) => {
119
+ const matching = findProfile(store.profiles, selector) ?? findProfile(store.profiles, selected.id);
120
+ if (!matching)
121
+ return Effect.void;
122
+ return saveProfiles(authStoreName(tool), { ...store, activeProfileId: matching.id });
123
+ });
124
+ return yield* inspectAllToolProfiles(tools);
125
+ });
126
+ /**
127
+ * Persist legacy single-token auth files into shared profile stores.
128
+ *
129
+ * Supports both XDG Atlassian auth files and tool-specific legacy paths such
130
+ * as Confluence's historical `~/.confluence/auth.json`.
131
+ */
132
+ export const migrateLegacyProfiles = (tools = ATLASSIAN_TOOLS) => Effect.gen(function* () {
133
+ const fs = yield* FileSystem.FileSystem;
134
+ yield* Effect.forEach(uniqueAuthTools(tools), (tool) => Effect.gen(function* () {
135
+ const storeName = authStoreName(tool);
136
+ const profilesPath = yield* getProfilesPath(storeName);
137
+ const hasProfilesFile = yield* fs.exists(profilesPath).pipe(Effect.catch(() => Effect.succeed(false)));
138
+ if (hasProfilesFile)
139
+ return;
140
+ const store = yield* loadProfiles(storeName);
141
+ if (store.profiles.length > 0) {
142
+ yield* saveProfiles(storeName, store);
143
+ return;
144
+ }
145
+ const legacyToken = yield* loadLegacyToken(tool);
146
+ if (legacyToken !== null) {
147
+ yield* saveProfileToken(storeName, legacyToken);
148
+ }
149
+ }));
150
+ return yield* inspectAllToolProfiles(tools);
151
+ });
152
+ /**
153
+ * Refresh expired active profiles.
154
+ *
155
+ * Fails when an expired profile lacks OAuth client configuration so refresh
156
+ * callers cannot report success while leaving a token expired.
157
+ */
158
+ export const refreshActiveProfiles = (tools = ATLASSIAN_TOOLS) => Effect.gen(function* () {
159
+ yield* Effect.forEach(uniqueAuthTools(tools), (tool) => Effect.gen(function* () {
160
+ const storeName = authStoreName(tool);
161
+ const store = yield* loadProfiles(storeName);
162
+ const active = store.profiles.find((profile) => profile.id === store.activeProfileId) ?? store.profiles[0] ??
163
+ null;
164
+ if (!active || !isTokenExpired(active.token, 0))
165
+ return;
166
+ const config = yield* loadOAuthConfig(storeName);
167
+ if (!config) {
168
+ return yield* Effect.fail(new MissingOAuthConfigError({ authStoreName: storeName, profileId: active.id }));
169
+ }
170
+ const refreshed = yield* refreshToken(active.token, config);
171
+ yield* saveProfileToken(storeName, refreshed);
172
+ }));
173
+ return yield* inspectAllToolProfiles(tools);
174
+ });
175
+ //# sourceMappingURL=ProfileManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileManager.js","sourceRoot":"","sources":["../../src/config/ProfileManager.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,7 @@
1
- /**
2
- * Persistent token and OAuth config storage with schema validation and secure file I/O.
3
- *
4
- * **Mental model**
5
- *
6
- * - **Load returns null, not error**: {@link loadToken} and {@link loadOAuthConfig} return
7
- * `null` for missing/corrupt files — callers decide whether absence is an error.
8
- * - **Save is atomic**: Writes go through {@link writeSecureFile} with `0o600` permissions.
9
- * - **Schema-gated reads**: JSON is parsed then validated via `Schema.decodeUnknown` —
10
- * corrupt data is treated as absent rather than crashing.
11
- *
12
- * **Common tasks**
13
- *
14
- * - Load stored token: {@link loadToken}
15
- * - Persist after refresh: {@link saveToken}
16
- * - Check expiration: {@link isTokenExpired}
17
- *
18
- * @module
19
- */
20
- import type * as Error from "@effect/platform/Error";
21
- import * as FileSystem from "@effect/platform/FileSystem";
22
- import type * as Path from "@effect/platform/Path";
23
1
  import * as Effect from "effect/Effect";
2
+ import * as FileSystem from "effect/FileSystem";
3
+ import type * as Path from "effect/Path";
4
+ import type * as PlatformError from "effect/PlatformError";
24
5
  import { type HomeDirectoryError, type HomeDirectoryTag } from "./ConfigPaths.js";
25
6
  import { type OAuthConfig, type OAuthToken } from "./OAuthSchemas.js";
26
7
  declare const FileSystemError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
@@ -55,7 +36,7 @@ export declare const loadToken: (toolName: string) => Effect.Effect<OAuthToken |
55
36
  *
56
37
  * @category Token Storage
57
38
  */
58
- export declare const saveToken: (toolName: string, token: OAuthToken) => Effect.Effect<void, FileSystemError | HomeDirectoryError | Error.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
39
+ export declare const saveToken: (toolName: string, token: OAuthToken) => Effect.Effect<void, FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
59
40
  /**
60
41
  * Delete stored OAuth token.
61
42
  *
@@ -81,7 +62,7 @@ export declare const loadOAuthConfig: (toolName: string) => Effect.Effect<OAuthC
81
62
  *
82
63
  * @category OAuth Config
83
64
  */
84
- export declare const saveOAuthConfig: (toolName: string, config: OAuthConfig) => Effect.Effect<void, FileSystemError | HomeDirectoryError | Error.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
65
+ export declare const saveOAuthConfig: (toolName: string, config: OAuthConfig) => Effect.Effect<void, FileSystemError | HomeDirectoryError | PlatformError.PlatformError, FileSystem.FileSystem | Path.Path | HomeDirectoryTag>;
85
66
  /**
86
67
  * Check if token is expired or about to expire.
87
68
  *
@@ -1 +1 @@
1
- {"version":3,"file":"TokenStorage.d.ts","sourceRoot":"","sources":["../../src/config/TokenStorage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,KAAK,KAAK,MAAM,wBAAwB,CAAA;AACpD,OAAO,KAAK,UAAU,MAAM,6BAA6B,CAAA;AACzD,OAAO,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAA;AAElD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEjF,OAAO,EAAE,KAAK,WAAW,EAAqB,KAAK,UAAU,EAAoB,MAAM,mBAAmB,CAAA;;;;AAE1G;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CACd,UAAU,GAAG,IAAI,EACjB,eAAe,GAAG,kBAAkB,EACpC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAoClD,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,EAChB,OAAO,UAAU,KAChB,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,eAAe,GAAG,kBAAkB,GAAG,KAAK,CAAC,aAAa,EAC1D,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAUlD,CAAA;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,kBAAkB,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAQ7G,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CACd,WAAW,GAAG,IAAI,EAClB,eAAe,GAAG,kBAAkB,EACpC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAoClD,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,QAAQ,WAAW,KAClB,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,eAAe,GAAG,kBAAkB,GAAG,KAAK,CAAC,aAAa,EAC1D,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAUlD,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,UAAU,EAAE,WAAU,MAAsB,KAAG,OAC1C,CAAA"}
1
+ {"version":3,"file":"TokenStorage.d.ts","sourceRoot":"","sources":["../../src/config/TokenStorage.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAC/C,OAAO,KAAK,KAAK,IAAI,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,KAAK,aAAa,MAAM,sBAAsB,CAAA;AAE1D,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEjF,OAAO,EAAE,KAAK,WAAW,EAAqB,KAAK,UAAU,EAAoB,MAAM,mBAAmB,CAAA;;;;AAU1G;;;;GAIG;AACH,qBAAa,eAAgB,SAAQ,qBAAoC;IACvE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACzB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CACd,UAAU,GAAG,IAAI,EACjB,eAAe,GAAG,kBAAkB,EACpC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CA8BlD,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,SAAS,GACpB,UAAU,MAAM,EAChB,OAAO,UAAU,KAChB,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,EAClE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAUlD,CAAA;AAEJ;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,GACtB,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,kBAAkB,EAAE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAQ7G,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,KACf,MAAM,CAAC,MAAM,CACd,WAAW,GAAG,IAAI,EAClB,eAAe,GAAG,kBAAkB,EACpC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CA8BlD,CAAA;AAEJ;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,GAC1B,UAAU,MAAM,EAChB,QAAQ,WAAW,KAClB,MAAM,CAAC,MAAM,CACd,IAAI,EACJ,eAAe,GAAG,kBAAkB,GAAG,aAAa,CAAC,aAAa,EAClE,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAUlD,CAAA;AAEJ;;;;;;;;GAQG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,UAAU,EAAE,WAAU,MAAsB,KAAG,OAC1C,CAAA"}