@prsense/config 0.1.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 (82) hide show
  1. package/LICENSE +201 -0
  2. package/dist/buildResolvedConfig.d.ts +7 -0
  3. package/dist/buildResolvedConfig.d.ts.map +1 -0
  4. package/dist/buildResolvedConfig.js +57 -0
  5. package/dist/buildResolvedConfig.js.map +1 -0
  6. package/dist/defaults.d.ts +24 -0
  7. package/dist/defaults.d.ts.map +1 -0
  8. package/dist/defaults.js +24 -0
  9. package/dist/defaults.js.map +1 -0
  10. package/dist/env/loadEnvConfig.d.ts +3 -0
  11. package/dist/env/loadEnvConfig.d.ts.map +1 -0
  12. package/dist/env/loadEnvConfig.js +9 -0
  13. package/dist/env/loadEnvConfig.js.map +1 -0
  14. package/dist/env/schema.d.ts +25 -0
  15. package/dist/env/schema.d.ts.map +1 -0
  16. package/dist/env/schema.js +19 -0
  17. package/dist/env/schema.js.map +1 -0
  18. package/dist/errors.d.ts +2 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +2 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/index.d.ts +14 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +14 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/loadYamlConfig.d.ts +2 -0
  27. package/dist/loadYamlConfig.d.ts.map +1 -0
  28. package/dist/loadYamlConfig.js +8 -0
  29. package/dist/loadYamlConfig.js.map +1 -0
  30. package/dist/merge.d.ts +2 -0
  31. package/dist/merge.d.ts.map +1 -0
  32. package/dist/merge.js +15 -0
  33. package/dist/merge.js.map +1 -0
  34. package/dist/resolveConfig.d.ts +7 -0
  35. package/dist/resolveConfig.d.ts.map +1 -0
  36. package/dist/resolveConfig.js +24 -0
  37. package/dist/resolveConfig.js.map +1 -0
  38. package/dist/resolveCredentials.d.ts +3 -0
  39. package/dist/resolveCredentials.d.ts.map +1 -0
  40. package/dist/resolveCredentials.js +65 -0
  41. package/dist/resolveCredentials.js.map +1 -0
  42. package/dist/resolveEnvironment.d.ts +6 -0
  43. package/dist/resolveEnvironment.d.ts.map +1 -0
  44. package/dist/resolveEnvironment.js +14 -0
  45. package/dist/resolveEnvironment.js.map +1 -0
  46. package/dist/schema.d.ts +60 -0
  47. package/dist/schema.d.ts.map +1 -0
  48. package/dist/schema.js +41 -0
  49. package/dist/schema.js.map +1 -0
  50. package/dist/types.d.ts +91 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +3 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/user/loadGlobalConfig.d.ts +3 -0
  55. package/dist/user/loadGlobalConfig.d.ts.map +1 -0
  56. package/dist/user/loadGlobalConfig.js +21 -0
  57. package/dist/user/loadGlobalConfig.js.map +1 -0
  58. package/dist/user/loadRepoConfig.d.ts +3 -0
  59. package/dist/user/loadRepoConfig.d.ts.map +1 -0
  60. package/dist/user/loadRepoConfig.js +28 -0
  61. package/dist/user/loadRepoConfig.js.map +1 -0
  62. package/dist/user/mergeUserConfigs.d.ts +3 -0
  63. package/dist/user/mergeUserConfigs.d.ts.map +1 -0
  64. package/dist/user/mergeUserConfigs.js +20 -0
  65. package/dist/user/mergeUserConfigs.js.map +1 -0
  66. package/dist/user/schema.d.ts +47 -0
  67. package/dist/user/schema.d.ts.map +1 -0
  68. package/dist/user/schema.js +38 -0
  69. package/dist/user/schema.js.map +1 -0
  70. package/dist/validateCredentials.d.ts +3 -0
  71. package/dist/validateCredentials.d.ts.map +1 -0
  72. package/dist/validateCredentials.js +95 -0
  73. package/dist/validateCredentials.js.map +1 -0
  74. package/dist/validateEnvironment.d.ts +3 -0
  75. package/dist/validateEnvironment.d.ts.map +1 -0
  76. package/dist/validateEnvironment.js +9 -0
  77. package/dist/validateEnvironment.js.map +1 -0
  78. package/dist/validateResolvedConfig.d.ts +12 -0
  79. package/dist/validateResolvedConfig.d.ts.map +1 -0
  80. package/dist/validateResolvedConfig.js +73 -0
  81. package/dist/validateResolvedConfig.js.map +1 -0
  82. package/package.json +34 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveCredentials.js","sourceRoot":"","sources":["../src/resolveCredentials.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,2CAA2C;QAE3C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;YACxC,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;aAC3C;YACH,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;QAExB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;YACxC,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;aAC3C;YACH,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;QAExB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;YAC9C,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI;gBACf,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,yBAAyB;aAC9C;YACH,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;QAExB,8CAA8C;QAE9C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACtC,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI;gBACf,IAAI,EAAE,OAAgB;gBACtB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBACvC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B;oBAC3C,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE;oBAC9D,CAAC,CAAC,EAAE,CAAC;aACR;YACH,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB;gBAC/B,OAAO,CAAC,GAAG,CAAC,8BAA8B;gBAC1C,OAAO,CAAC,GAAG,CAAC,8BAA8B;gBAC5C,CAAC,CAAC;oBACE,SAAS,EAAE,IAAI;oBACf,IAAI,EAAE,KAAc;oBACpB,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB;oBACxC,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B;oBACtD,cAAc,EAAE,OAAO,CAAC,GAAG,CAAC,8BAA8B;oBAC1D,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B;wBAC3C,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE;wBAC9D,CAAC,CAAC,EAAE,CAAC;iBACR;gBACH,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;QAE1B,8CAA8C;QAE9C,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;YACtC,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI;gBACf,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB;gBACvC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B;oBAC3C,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA6B,EAAE;oBAC9D,CAAC,CAAC,EAAE,CAAC;aACR;YACH,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;QAExB,6CAA6C;QAE7C,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;YACxC,CAAC,CAAC;gBACE,SAAS,EAAE,IAAI;gBACf,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB;aAC9C;YACH,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE;KACzB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { RuntimeEnvironment, RuntimeMode } from "./types.js";
2
+ export declare function resolveEnvironment(mode: RuntimeMode, repository: {
3
+ root: string;
4
+ provider: "github" | "gitlab" | "filesystem";
5
+ }): RuntimeEnvironment;
6
+ //# sourceMappingURL=resolveEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveEnvironment.d.ts","sourceRoot":"","sources":["../src/resolveEnvironment.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAElE,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,WAAW,EACjB,UAAU,EAAE;IACV,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,GAAG,QAAQ,GAAG,YAAY,CAAC;CAC9C,GACA,kBAAkB,CAYpB"}
@@ -0,0 +1,14 @@
1
+ import { resolveConfig } from "./resolveConfig.js";
2
+ import { resolveCredentials } from "./resolveCredentials.js";
3
+ import { validateEnvironment } from "./validateEnvironment.js";
4
+ export function resolveEnvironment(mode, repository) {
5
+ const config = resolveConfig(mode, repository);
6
+ const credentials = resolveCredentials();
7
+ const issues = validateEnvironment(config, credentials);
8
+ return {
9
+ config,
10
+ credentials,
11
+ issues,
12
+ };
13
+ }
14
+ //# sourceMappingURL=resolveEnvironment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveEnvironment.js","sourceRoot":"","sources":["../src/resolveEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAI/D,MAAM,UAAU,kBAAkB,CAChC,IAAiB,EACjB,UAGC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE/C,MAAM,WAAW,GAAG,kBAAkB,EAAE,CAAC;IAEzC,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAExD,OAAO;QACL,MAAM;QACN,WAAW;QACX,MAAM;KACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,60 @@
1
+ import { z } from "zod";
2
+ export declare const RuntimeConfigSchema: z.ZodObject<{
3
+ llm: z.ZodObject<{
4
+ provider: z.ZodEnum<{
5
+ ollama: "ollama";
6
+ openai: "openai";
7
+ anthropic: "anthropic";
8
+ google: "google";
9
+ }>;
10
+ model: z.ZodString;
11
+ temperature: z.ZodNumber;
12
+ }, z.core.$strip>;
13
+ embeddings: z.ZodObject<{
14
+ provider: z.ZodEnum<{
15
+ ollama: "ollama";
16
+ openai: "openai";
17
+ }>;
18
+ model: z.ZodString;
19
+ }, z.core.$strip>;
20
+ index: z.ZodObject<{
21
+ chunkSizeChars: z.ZodNumber;
22
+ chunkOverlapChars: z.ZodNumber;
23
+ maxFileSizeBytes: z.ZodNumber;
24
+ }, z.core.$strip>;
25
+ review: z.ZodObject<{
26
+ confidenceThreshold: z.ZodNumber;
27
+ maxSignals: z.ZodNumber;
28
+ }, z.core.$strip>;
29
+ context: z.ZodObject<{
30
+ maxChunks: z.ZodNumber;
31
+ }, z.core.$strip>;
32
+ database: z.ZodOptional<z.ZodObject<{
33
+ url: z.ZodString;
34
+ mode: z.ZodEnum<{
35
+ bundled: "bundled";
36
+ external: "external";
37
+ }>;
38
+ }, z.core.$strip>>;
39
+ git: z.ZodObject<{
40
+ baseBranch: z.ZodString;
41
+ }, z.core.$strip>;
42
+ delivery: z.ZodOptional<z.ZodObject<{
43
+ platform: z.ZodEnum<{
44
+ github: "github";
45
+ gitlab: "gitlab";
46
+ }>;
47
+ other: z.ZodDefault<z.ZodArray<z.ZodEnum<{
48
+ slack: "slack";
49
+ jira: "jira";
50
+ }>>>;
51
+ }, z.core.$strip>>;
52
+ logLevel: z.ZodDefault<z.ZodEnum<{
53
+ error: "error";
54
+ debug: "debug";
55
+ info: "info";
56
+ warn: "warn";
57
+ }>>;
58
+ }, z.core.$strip>;
59
+ export type RuntimeConfig = z.infer<typeof RuntimeConfigSchema>;
60
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBA8C9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,41 @@
1
+ import { z } from "zod";
2
+ export const RuntimeConfigSchema = z.object({
3
+ llm: z.object({
4
+ provider: z.enum(["ollama", "openai", "anthropic", "google"]),
5
+ model: z.string(),
6
+ temperature: z.number().min(0).max(1),
7
+ }),
8
+ embeddings: z.object({
9
+ provider: z.enum(["ollama", "openai"]),
10
+ model: z.string(),
11
+ }),
12
+ index: z.object({
13
+ chunkSizeChars: z.number().int().positive(),
14
+ chunkOverlapChars: z.number().int().positive(),
15
+ maxFileSizeBytes: z.number().int().positive(),
16
+ }),
17
+ review: z.object({
18
+ confidenceThreshold: z.number().min(0).max(1),
19
+ maxSignals: z.number().int().positive(),
20
+ }),
21
+ context: z.object({
22
+ maxChunks: z.number().int().positive(),
23
+ }),
24
+ database: z
25
+ .object({
26
+ url: z.string(),
27
+ mode: z.enum(["bundled", "external"]),
28
+ })
29
+ .optional(),
30
+ git: z.object({
31
+ baseBranch: z.string(),
32
+ }),
33
+ delivery: z
34
+ .object({
35
+ platform: z.enum(["github", "gitlab"]),
36
+ other: z.array(z.enum(["slack", "jira"])).default([]),
37
+ })
38
+ .optional(),
39
+ logLevel: z.enum(["debug", "info", "warn", "error"]).default("warn"),
40
+ });
41
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;QACZ,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC7D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;KACtC,CAAC;IAEF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtC,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;KAClB,CAAC;IAEF,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAC3C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;QAC9C,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KAC9C,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC7C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACxC,CAAC;IAEF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE;KACvC,CAAC;IAEF,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE;QACf,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;KACtC,CAAC;SACD,QAAQ,EAAE;IAEb,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;QACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;KACvB,CAAC;IAEF,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QACtC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KACtD,CAAC;SACD,QAAQ,EAAE;IAEb,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CACrE,CAAC,CAAC"}
@@ -0,0 +1,91 @@
1
+ export type CredentialContext = {
2
+ openai?: {
3
+ available: boolean;
4
+ apiKey?: string;
5
+ };
6
+ google?: {
7
+ available: boolean;
8
+ apiKey?: string;
9
+ };
10
+ anthropic?: {
11
+ available: boolean;
12
+ apiKey?: string;
13
+ };
14
+ github?: {
15
+ available: boolean;
16
+ mode?: "token" | "app";
17
+ token?: string;
18
+ appId?: string;
19
+ privateKey?: string;
20
+ installationId?: string;
21
+ webhookSecret?: string;
22
+ };
23
+ gitlab?: {
24
+ available: boolean;
25
+ token?: string;
26
+ webhookSecret?: string;
27
+ };
28
+ slack?: {
29
+ available: boolean;
30
+ botToken?: string;
31
+ };
32
+ };
33
+ declare const OTHER_CHANNELS: readonly ["jira", "slack"];
34
+ export type OtherChannel = (typeof OTHER_CHANNELS)[number];
35
+ export type PlatformDeliveryChannel = "github" | "gitlab";
36
+ export type Delivery = {
37
+ platform: PlatformDeliveryChannel;
38
+ other: readonly OtherChannel[];
39
+ };
40
+ type BaseResolvedConfig = {
41
+ repository: {
42
+ root: string;
43
+ provider: "github" | "gitlab" | "filesystem";
44
+ };
45
+ index: {
46
+ chunkSizeChars: number;
47
+ chunkOverlapChars: number;
48
+ maxFileSizeBytes: number;
49
+ };
50
+ review: {
51
+ confidenceThreshold: number;
52
+ maxSignals: number;
53
+ };
54
+ context: {
55
+ maxChunks: number;
56
+ };
57
+ llm: {
58
+ provider: "ollama" | "openai" | "google" | "anthropic";
59
+ model: string;
60
+ temperature: number;
61
+ };
62
+ embeddings: {
63
+ provider: "ollama" | "openai";
64
+ model: string;
65
+ };
66
+ database: {
67
+ url: string;
68
+ mode: "bundled" | "external";
69
+ };
70
+ };
71
+ export type CliResolvedConfig = BaseResolvedConfig & {
72
+ mode: "cli";
73
+ };
74
+ export type DaemonResolvedConfig = BaseResolvedConfig & {
75
+ mode: "daemon";
76
+ delivery: Delivery;
77
+ };
78
+ export type ResolvedConfig = CliResolvedConfig | DaemonResolvedConfig;
79
+ export type ValidationIssue = {
80
+ level: "error" | "warning";
81
+ message: string;
82
+ path?: string;
83
+ };
84
+ export type RuntimeEnvironment = {
85
+ config: ResolvedConfig;
86
+ credentials: CredentialContext;
87
+ issues: ValidationIssue[];
88
+ };
89
+ export type RuntimeMode = "cli" | "daemon";
90
+ export {};
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,3 @@
1
+ const OTHER_CHANNELS = ["jira", "slack"];
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AA8CA,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,CAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { UserConfig } from "./schema.js";
2
+ export declare function loadGlobalConfig(): UserConfig;
3
+ //# sourceMappingURL=loadGlobalConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadGlobalConfig.d.ts","sourceRoot":"","sources":["../../src/user/loadGlobalConfig.ts"],"names":[],"mappings":"AAKA,OAAO,EAAoB,UAAU,EAAE,MAAM,aAAa,CAAC;AAS3D,wBAAgB,gBAAgB,IAAI,UAAU,CAY7C"}
@@ -0,0 +1,21 @@
1
+ // packages/config/src/user/loadGlobalConfig.ts
2
+ import fs from "node:fs";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ import yaml from "yaml";
6
+ import { UserConfigSchema } from "./schema.js";
7
+ function getGlobalConfigPath() {
8
+ const base = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), ".config");
9
+ return path.join(base, "prsense", "config.yml");
10
+ }
11
+ export function loadGlobalConfig() {
12
+ const configPath = getGlobalConfigPath();
13
+ console.debug("Loading config from : ", configPath);
14
+ if (!fs.existsSync(configPath)) {
15
+ return UserConfigSchema.parse({});
16
+ }
17
+ const raw = fs.readFileSync(configPath, "utf8");
18
+ const parsed = yaml.parse(raw);
19
+ return UserConfigSchema.parse(parsed ?? {});
20
+ }
21
+ //# sourceMappingURL=loadGlobalConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadGlobalConfig.js","sourceRoot":"","sources":["../../src/user/loadGlobalConfig.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAE3D,SAAS,mBAAmB;IAC1B,MAAM,IAAI,GACR,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAEpE,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,UAAU,GAAG,mBAAmB,EAAE,CAAC;IACzC,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,UAAU,CAAC,CAAC;IAEpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,OAAO,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE/B,OAAO,gBAAgB,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { UserConfig } from "./schema.js";
2
+ export declare function loadRepoConfig(cwd: string): UserConfig;
3
+ //# sourceMappingURL=loadRepoConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadRepoConfig.d.ts","sourceRoot":"","sources":["../../src/user/loadRepoConfig.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,UAAU,EAAE,MAAM,aAAa,CAAC;AAiB3D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAWtD"}
@@ -0,0 +1,28 @@
1
+ // packages/config/src/user/loadRepoConfig.ts
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import yaml from "yaml";
5
+ import { UserConfigSchema } from "./schema.js";
6
+ const CONFIG_FILENAME = "prsense.yml";
7
+ function findConfigFile(startDir) {
8
+ let dir = startDir;
9
+ while (true) {
10
+ const candidate = path.join(dir, CONFIG_FILENAME);
11
+ if (fs.existsSync(candidate))
12
+ return candidate;
13
+ const parent = path.dirname(dir);
14
+ if (parent === dir)
15
+ return null;
16
+ dir = parent;
17
+ }
18
+ }
19
+ export function loadRepoConfig(cwd) {
20
+ const configPath = findConfigFile(cwd);
21
+ if (!configPath) {
22
+ return UserConfigSchema.parse({});
23
+ }
24
+ const raw = fs.readFileSync(configPath, "utf8");
25
+ const parsed = yaml.parse(raw);
26
+ return UserConfigSchema.parse(parsed ?? {});
27
+ }
28
+ //# sourceMappingURL=loadRepoConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadRepoConfig.js","sourceRoot":"","sources":["../../src/user/loadRepoConfig.ts"],"names":[],"mappings":"AAAA,6CAA6C;AAC7C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,gBAAgB,EAAc,MAAM,aAAa,CAAC;AAE3D,MAAM,eAAe,GAAG,aAAa,CAAC;AAEtC,SAAS,cAAc,CAAC,QAAgB;IACtC,IAAI,GAAG,GAAG,QAAQ,CAAC;IAEnB,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAClD,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;YAAE,OAAO,SAAS,CAAC;QAE/C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAW;IACxC,MAAM,UAAU,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IAEvC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,gBAAgB,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE/B,OAAO,gBAAgB,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { UserConfig } from "./schema.js";
2
+ export declare function mergeUserConfigs(globalConfig: UserConfig, repoConfig: UserConfig): UserConfig;
3
+ //# sourceMappingURL=mergeUserConfigs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeUserConfigs.d.ts","sourceRoot":"","sources":["../../src/user/mergeUserConfigs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AA0B9C,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,UAAU,EACxB,UAAU,EAAE,UAAU,GACrB,UAAU,CAEZ"}
@@ -0,0 +1,20 @@
1
+ function mergeObjects(base, override) {
2
+ const result = { ...base };
3
+ for (const key of Object.keys(override)) {
4
+ const value = override[key];
5
+ if (value &&
6
+ typeof value === "object" &&
7
+ !Array.isArray(value) &&
8
+ typeof result[key] === "object") {
9
+ result[key] = mergeObjects(result[key], value);
10
+ }
11
+ else if (value !== undefined) {
12
+ result[key] = value;
13
+ }
14
+ }
15
+ return result;
16
+ }
17
+ export function mergeUserConfigs(globalConfig, repoConfig) {
18
+ return mergeObjects(globalConfig, repoConfig);
19
+ }
20
+ //# sourceMappingURL=mergeUserConfigs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeUserConfigs.js","sourceRoot":"","sources":["../../src/user/mergeUserConfigs.ts"],"names":[],"mappings":"AAGA,SAAS,YAAY,CACnB,IAAO,EACP,QAAoB;IAEpB,MAAM,MAAM,GAAwB,EAAE,GAAG,IAAI,EAAE,CAAC;IAEhD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;QACxC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAc,CAAC,CAAC;QAEvC,IACE,KAAK;YACL,OAAO,KAAK,KAAK,QAAQ;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YACrB,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,EAC/B,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;aAAM,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,MAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,YAAwB,EACxB,UAAsB;IAEtB,OAAO,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,47 @@
1
+ import { z } from "zod";
2
+ export declare const UserConfigSchema: z.ZodObject<{
3
+ llm: z.ZodObject<{
4
+ provider: z.ZodDefault<z.ZodEnum<{
5
+ ollama: "ollama";
6
+ openai: "openai";
7
+ anthropic: "anthropic";
8
+ google: "google";
9
+ }>>;
10
+ model: z.ZodString;
11
+ temperature: z.ZodDefault<z.ZodNumber>;
12
+ }, z.core.$strip>;
13
+ embeddings: z.ZodObject<{
14
+ provider: z.ZodDefault<z.ZodEnum<{
15
+ ollama: "ollama";
16
+ openai: "openai";
17
+ }>>;
18
+ model: z.ZodDefault<z.ZodString>;
19
+ }, z.core.$strip>;
20
+ index: z.ZodObject<{
21
+ chunkSizeChars: z.ZodDefault<z.ZodNumber>;
22
+ chunkOverlapChars: z.ZodDefault<z.ZodNumber>;
23
+ maxFileSizeBytes: z.ZodDefault<z.ZodNumber>;
24
+ }, z.core.$strip>;
25
+ review: z.ZodObject<{
26
+ confidenceThreshold: z.ZodDefault<z.ZodNumber>;
27
+ maxSignals: z.ZodDefault<z.ZodNumber>;
28
+ }, z.core.$strip>;
29
+ context: z.ZodObject<{
30
+ maxChunks: z.ZodDefault<z.ZodNumber>;
31
+ }, z.core.$strip>;
32
+ git: z.ZodObject<{
33
+ baseBranch: z.ZodDefault<z.ZodString>;
34
+ }, z.core.$strip>;
35
+ delivery: z.ZodOptional<z.ZodObject<{
36
+ platform: z.ZodEnum<{
37
+ github: "github";
38
+ gitlab: "gitlab";
39
+ }>;
40
+ other: z.ZodDefault<z.ZodArray<z.ZodEnum<{
41
+ slack: "slack";
42
+ jira: "jira";
43
+ }>>>;
44
+ }, z.core.$strip>>;
45
+ }, z.core.$strip>;
46
+ export type UserConfig = z.infer<typeof UserConfigSchema>;
47
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/user/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAuC3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,38 @@
1
+ import { z } from "zod";
2
+ const PlatformChannelSchema = z.enum(["github", "gitlab"]);
3
+ const OtherChannelSchema = z.enum(["slack", "jira"]);
4
+ export const UserConfigSchema = z.object({
5
+ llm: z.object({
6
+ provider: z
7
+ .enum(["ollama", "openai", "anthropic", "google"])
8
+ .default("ollama"),
9
+ model: z.string(),
10
+ temperature: z.number().min(0).max(1).default(0.1),
11
+ }),
12
+ embeddings: z.object({
13
+ provider: z.enum(["ollama", "openai"]).default("ollama"),
14
+ model: z.string().default("nomic-embed-text"),
15
+ }),
16
+ index: z.object({
17
+ chunkSizeChars: z.number().int().positive().default(1000),
18
+ chunkOverlapChars: z.number().int().positive().default(200),
19
+ maxFileSizeBytes: z.number().int().positive().default(1_000_000),
20
+ }),
21
+ review: z.object({
22
+ confidenceThreshold: z.number().min(0).max(1).default(0.6),
23
+ maxSignals: z.number().int().positive().default(10),
24
+ }),
25
+ context: z.object({
26
+ maxChunks: z.number().int().positive().default(5),
27
+ }),
28
+ git: z.object({
29
+ baseBranch: z.string().default("main"),
30
+ }),
31
+ delivery: z
32
+ .object({
33
+ platform: PlatformChannelSchema,
34
+ other: z.array(OtherChannelSchema).default([]),
35
+ })
36
+ .optional(),
37
+ });
38
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/user/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC3D,MAAM,kBAAkB,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;QACZ,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;aACjD,OAAO,CAAC,QAAQ,CAAC;QACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;QACjB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;KACnD,CAAC;IAEF,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACxD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,kBAAkB,CAAC;KAC9C,CAAC;IAEF,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACzD,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;QAC3D,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;KACjE,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,mBAAmB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC;QAC1D,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;KACpD,CAAC;IAEF,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC;QAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;KAClD,CAAC;IAEF,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC;QACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;KACvC,CAAC;IAEF,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC;QACN,QAAQ,EAAE,qBAAqB;QAC/B,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KAC/C,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CredentialContext, ResolvedConfig, ValidationIssue as ConfigValidationIssue } from "./types.js";
2
+ export declare function validateCredentials(config: ResolvedConfig, creds: CredentialContext): ConfigValidationIssue[];
3
+ //# sourceMappingURL=validateCredentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateCredentials.d.ts","sourceRoot":"","sources":["../src/validateCredentials.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,eAAe,IAAI,qBAAqB,EACzC,MAAM,YAAY,CAAC;AAEpB,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,iBAAiB,GACvB,qBAAqB,EAAE,CA4GzB"}
@@ -0,0 +1,95 @@
1
+ export function validateCredentials(config, creds) {
2
+ const issues = [];
3
+ /* ------------------------------------------------- */
4
+ /* LLM Providers */
5
+ /* ------------------------------------------------- */
6
+ switch (config.llm.provider) {
7
+ case "openai":
8
+ if (!creds.openai?.apiKey) {
9
+ issues.push({
10
+ level: "error",
11
+ message: "OpenAI selected but API key is missing",
12
+ path: "llm.provider",
13
+ });
14
+ }
15
+ break;
16
+ case "google":
17
+ if (!creds.google?.apiKey) {
18
+ issues.push({
19
+ level: "error",
20
+ message: "Gemini selected but API key is missing",
21
+ path: "llm.provider",
22
+ });
23
+ }
24
+ break;
25
+ case "anthropic":
26
+ if (!creds.anthropic?.apiKey) {
27
+ issues.push({
28
+ level: "error",
29
+ message: "Claude selected but API key is missing",
30
+ path: "llm.provider",
31
+ });
32
+ }
33
+ break;
34
+ }
35
+ /* ------------------------------------------------- */
36
+ /* Embeddings */
37
+ /* ------------------------------------------------- */
38
+ if (config.embeddings.provider === "openai") {
39
+ if (!creds.openai?.apiKey) {
40
+ issues.push({
41
+ level: "error",
42
+ message: "OpenAI embeddings selected but API key missing",
43
+ path: "embeddings.provider",
44
+ });
45
+ }
46
+ }
47
+ /* ------------------------------------------------- */
48
+ /* Daemon Delivery Validation */
49
+ /* ------------------------------------------------- */
50
+ if (config.mode === "daemon") {
51
+ if (config.delivery.platform === "github") {
52
+ if (!creds.github?.available) {
53
+ issues.push({
54
+ level: "error",
55
+ message: "GitHub delivery enabled but credentials missing",
56
+ path: "delivery.platform",
57
+ });
58
+ }
59
+ if (!creds.github?.webhookSecret) {
60
+ issues.push({
61
+ level: "error",
62
+ message: "GitHub webhook secret missing (PRSENSE_GITHUB_WEBHOOK_SECRET)",
63
+ path: "delivery.platform",
64
+ });
65
+ }
66
+ }
67
+ if (config.delivery.platform === "gitlab") {
68
+ if (!creds.gitlab?.token) {
69
+ issues.push({
70
+ level: "error",
71
+ message: "GitLab delivery enabled but token missing",
72
+ path: "delivery.platform",
73
+ });
74
+ }
75
+ if (!creds.gitlab?.webhookSecret) {
76
+ issues.push({
77
+ level: "error",
78
+ message: "GitLab webhook secret missing (PRSENSE_GITLAB_WEBHOOK_SECRET)",
79
+ path: "delivery.platform",
80
+ });
81
+ }
82
+ }
83
+ for (const channel of config.delivery.other) {
84
+ if (channel === "slack" && !creds.slack?.botToken) {
85
+ issues.push({
86
+ level: "error",
87
+ message: "Slack delivery enabled but bot token missing",
88
+ path: "delivery.other",
89
+ });
90
+ }
91
+ }
92
+ }
93
+ return issues;
94
+ }
95
+ //# sourceMappingURL=validateCredentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateCredentials.js","sourceRoot":"","sources":["../src/validateCredentials.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { ResolvedConfig, CredentialContext, ValidationIssue } from "./types.js";
2
+ export declare function validateEnvironment(config: ResolvedConfig, credentials: CredentialContext): ValidationIssue[];
3
+ //# sourceMappingURL=validateEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateEnvironment.d.ts","sourceRoot":"","sources":["../src/validateEnvironment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EACjB,eAAe,EAChB,MAAM,YAAY,CAAC;AAKpB,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,iBAAiB,GAC7B,eAAe,EAAE,CAOnB"}
@@ -0,0 +1,9 @@
1
+ import { validateResolvedConfig } from "./validateResolvedConfig.js";
2
+ import { validateCredentials } from "./validateCredentials.js";
3
+ export function validateEnvironment(config, credentials) {
4
+ const issues = [];
5
+ issues.push(...validateResolvedConfig(config).issues);
6
+ issues.push(...validateCredentials(config, credentials));
7
+ return issues;
8
+ }
9
+ //# sourceMappingURL=validateEnvironment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateEnvironment.js","sourceRoot":"","sources":["../src/validateEnvironment.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,UAAU,mBAAmB,CACjC,MAAsB,EACtB,WAA8B;IAE9B,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,MAAM,CAAC,IAAI,CAAC,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;IACtD,MAAM,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IAEzD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ResolvedConfig } from "./types.js";
2
+ export type ConfigValidationIssue = {
3
+ level: "error" | "warning";
4
+ message: string;
5
+ path?: string;
6
+ };
7
+ export type ConfigValidationResult = {
8
+ valid: boolean;
9
+ issues: ConfigValidationIssue[];
10
+ };
11
+ export declare function validateResolvedConfig(config: ResolvedConfig): ConfigValidationResult;
12
+ //# sourceMappingURL=validateResolvedConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validateResolvedConfig.d.ts","sourceRoot":"","sources":["../src/validateResolvedConfig.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,MAAM,qBAAqB,GAAG;IAClC,KAAK,EAAE,OAAO,GAAG,SAAS,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG;IACnC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,qBAAqB,EAAE,CAAC;CACjC,CAAC;AAEF,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,cAAc,GACrB,sBAAsB,CAoFxB"}