@synth-deploy/server 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 (317) hide show
  1. package/dist/agent/debrief-retention.d.ts +12 -0
  2. package/dist/agent/debrief-retention.d.ts.map +1 -0
  3. package/dist/agent/debrief-retention.js +27 -0
  4. package/dist/agent/debrief-retention.js.map +1 -0
  5. package/dist/agent/envoy-client.d.ts +216 -0
  6. package/dist/agent/envoy-client.d.ts.map +1 -0
  7. package/dist/agent/envoy-client.js +266 -0
  8. package/dist/agent/envoy-client.js.map +1 -0
  9. package/dist/agent/envoy-registry.d.ts +102 -0
  10. package/dist/agent/envoy-registry.d.ts.map +1 -0
  11. package/dist/agent/envoy-registry.js +319 -0
  12. package/dist/agent/envoy-registry.js.map +1 -0
  13. package/dist/agent/health-checker.d.ts +39 -0
  14. package/dist/agent/health-checker.d.ts.map +1 -0
  15. package/dist/agent/health-checker.js +49 -0
  16. package/dist/agent/health-checker.js.map +1 -0
  17. package/dist/agent/mcp-client-manager.d.ts +36 -0
  18. package/dist/agent/mcp-client-manager.d.ts.map +1 -0
  19. package/dist/agent/mcp-client-manager.js +106 -0
  20. package/dist/agent/mcp-client-manager.js.map +1 -0
  21. package/dist/agent/stale-deployment-detector.d.ts +15 -0
  22. package/dist/agent/stale-deployment-detector.d.ts.map +1 -0
  23. package/dist/agent/stale-deployment-detector.js +50 -0
  24. package/dist/agent/stale-deployment-detector.js.map +1 -0
  25. package/dist/agent/step-runner.d.ts +31 -0
  26. package/dist/agent/step-runner.d.ts.map +1 -0
  27. package/dist/agent/step-runner.js +80 -0
  28. package/dist/agent/step-runner.js.map +1 -0
  29. package/dist/agent/synth-agent.d.ts +168 -0
  30. package/dist/agent/synth-agent.d.ts.map +1 -0
  31. package/dist/agent/synth-agent.js +1195 -0
  32. package/dist/agent/synth-agent.js.map +1 -0
  33. package/dist/api/agent.d.ts +36 -0
  34. package/dist/api/agent.d.ts.map +1 -0
  35. package/dist/api/agent.js +867 -0
  36. package/dist/api/agent.js.map +1 -0
  37. package/dist/api/api-keys.d.ts +4 -0
  38. package/dist/api/api-keys.d.ts.map +1 -0
  39. package/dist/api/api-keys.js +118 -0
  40. package/dist/api/api-keys.js.map +1 -0
  41. package/dist/api/artifacts.d.ts +5 -0
  42. package/dist/api/artifacts.d.ts.map +1 -0
  43. package/dist/api/artifacts.js +142 -0
  44. package/dist/api/artifacts.js.map +1 -0
  45. package/dist/api/auth.d.ts +4 -0
  46. package/dist/api/auth.d.ts.map +1 -0
  47. package/dist/api/auth.js +280 -0
  48. package/dist/api/auth.js.map +1 -0
  49. package/dist/api/deployments.d.ts +11 -0
  50. package/dist/api/deployments.d.ts.map +1 -0
  51. package/dist/api/deployments.js +1098 -0
  52. package/dist/api/deployments.js.map +1 -0
  53. package/dist/api/environments.d.ts +5 -0
  54. package/dist/api/environments.d.ts.map +1 -0
  55. package/dist/api/environments.js +69 -0
  56. package/dist/api/environments.js.map +1 -0
  57. package/dist/api/envoy-reports.d.ts +17 -0
  58. package/dist/api/envoy-reports.d.ts.map +1 -0
  59. package/dist/api/envoy-reports.js +138 -0
  60. package/dist/api/envoy-reports.js.map +1 -0
  61. package/dist/api/envoys.d.ts +5 -0
  62. package/dist/api/envoys.d.ts.map +1 -0
  63. package/dist/api/envoys.js +192 -0
  64. package/dist/api/envoys.js.map +1 -0
  65. package/dist/api/fleet.d.ts +11 -0
  66. package/dist/api/fleet.d.ts.map +1 -0
  67. package/dist/api/fleet.js +394 -0
  68. package/dist/api/fleet.js.map +1 -0
  69. package/dist/api/graph.d.ts +8 -0
  70. package/dist/api/graph.d.ts.map +1 -0
  71. package/dist/api/graph.js +355 -0
  72. package/dist/api/graph.js.map +1 -0
  73. package/dist/api/health.d.ts +20 -0
  74. package/dist/api/health.d.ts.map +1 -0
  75. package/dist/api/health.js +248 -0
  76. package/dist/api/health.js.map +1 -0
  77. package/dist/api/idp-schemas.d.ts +41 -0
  78. package/dist/api/idp-schemas.d.ts.map +1 -0
  79. package/dist/api/idp-schemas.js +17 -0
  80. package/dist/api/idp-schemas.js.map +1 -0
  81. package/dist/api/idp.d.ts +6 -0
  82. package/dist/api/idp.d.ts.map +1 -0
  83. package/dist/api/idp.js +620 -0
  84. package/dist/api/idp.js.map +1 -0
  85. package/dist/api/intake.d.ts +10 -0
  86. package/dist/api/intake.d.ts.map +1 -0
  87. package/dist/api/intake.js +418 -0
  88. package/dist/api/intake.js.map +1 -0
  89. package/dist/api/partitions.d.ts +5 -0
  90. package/dist/api/partitions.d.ts.map +1 -0
  91. package/dist/api/partitions.js +113 -0
  92. package/dist/api/partitions.js.map +1 -0
  93. package/dist/api/progress-event-store.d.ts +62 -0
  94. package/dist/api/progress-event-store.d.ts.map +1 -0
  95. package/dist/api/progress-event-store.js +118 -0
  96. package/dist/api/progress-event-store.js.map +1 -0
  97. package/dist/api/schemas.d.ts +1000 -0
  98. package/dist/api/schemas.d.ts.map +1 -0
  99. package/dist/api/schemas.js +328 -0
  100. package/dist/api/schemas.js.map +1 -0
  101. package/dist/api/security-boundaries.d.ts +4 -0
  102. package/dist/api/security-boundaries.d.ts.map +1 -0
  103. package/dist/api/security-boundaries.js +32 -0
  104. package/dist/api/security-boundaries.js.map +1 -0
  105. package/dist/api/settings.d.ts +4 -0
  106. package/dist/api/settings.d.ts.map +1 -0
  107. package/dist/api/settings.js +99 -0
  108. package/dist/api/settings.js.map +1 -0
  109. package/dist/api/system.d.ts +75 -0
  110. package/dist/api/system.d.ts.map +1 -0
  111. package/dist/api/system.js +558 -0
  112. package/dist/api/system.js.map +1 -0
  113. package/dist/api/telemetry.d.ts +4 -0
  114. package/dist/api/telemetry.d.ts.map +1 -0
  115. package/dist/api/telemetry.js +24 -0
  116. package/dist/api/telemetry.js.map +1 -0
  117. package/dist/api/users.d.ts +4 -0
  118. package/dist/api/users.d.ts.map +1 -0
  119. package/dist/api/users.js +173 -0
  120. package/dist/api/users.js.map +1 -0
  121. package/dist/archive-unpacker.d.ts +24 -0
  122. package/dist/archive-unpacker.d.ts.map +1 -0
  123. package/dist/archive-unpacker.js +239 -0
  124. package/dist/archive-unpacker.js.map +1 -0
  125. package/dist/artifact-analyzer.d.ts +59 -0
  126. package/dist/artifact-analyzer.d.ts.map +1 -0
  127. package/dist/artifact-analyzer.js +334 -0
  128. package/dist/artifact-analyzer.js.map +1 -0
  129. package/dist/auth/idp/index.d.ts +9 -0
  130. package/dist/auth/idp/index.d.ts.map +1 -0
  131. package/dist/auth/idp/index.js +5 -0
  132. package/dist/auth/idp/index.js.map +1 -0
  133. package/dist/auth/idp/ldap.d.ts +56 -0
  134. package/dist/auth/idp/ldap.d.ts.map +1 -0
  135. package/dist/auth/idp/ldap.js +276 -0
  136. package/dist/auth/idp/ldap.js.map +1 -0
  137. package/dist/auth/idp/oidc.d.ts +27 -0
  138. package/dist/auth/idp/oidc.d.ts.map +1 -0
  139. package/dist/auth/idp/oidc.js +97 -0
  140. package/dist/auth/idp/oidc.js.map +1 -0
  141. package/dist/auth/idp/role-mapping.d.ts +9 -0
  142. package/dist/auth/idp/role-mapping.d.ts.map +1 -0
  143. package/dist/auth/idp/role-mapping.js +16 -0
  144. package/dist/auth/idp/role-mapping.js.map +1 -0
  145. package/dist/auth/idp/saml.d.ts +40 -0
  146. package/dist/auth/idp/saml.d.ts.map +1 -0
  147. package/dist/auth/idp/saml.js +117 -0
  148. package/dist/auth/idp/saml.js.map +1 -0
  149. package/dist/auth/idp/types.d.ts +23 -0
  150. package/dist/auth/idp/types.d.ts.map +1 -0
  151. package/dist/auth/idp/types.js +2 -0
  152. package/dist/auth/idp/types.js.map +1 -0
  153. package/dist/fleet/fleet-executor.d.ts +35 -0
  154. package/dist/fleet/fleet-executor.d.ts.map +1 -0
  155. package/dist/fleet/fleet-executor.js +228 -0
  156. package/dist/fleet/fleet-executor.js.map +1 -0
  157. package/dist/fleet/fleet-store.d.ts +13 -0
  158. package/dist/fleet/fleet-store.d.ts.map +1 -0
  159. package/dist/fleet/fleet-store.js +13 -0
  160. package/dist/fleet/fleet-store.js.map +1 -0
  161. package/dist/fleet/index.d.ts +5 -0
  162. package/dist/fleet/index.d.ts.map +1 -0
  163. package/dist/fleet/index.js +4 -0
  164. package/dist/fleet/index.js.map +1 -0
  165. package/dist/fleet/representative-selector.d.ts +15 -0
  166. package/dist/fleet/representative-selector.d.ts.map +1 -0
  167. package/dist/fleet/representative-selector.js +71 -0
  168. package/dist/fleet/representative-selector.js.map +1 -0
  169. package/dist/graph/graph-executor.d.ts +36 -0
  170. package/dist/graph/graph-executor.d.ts.map +1 -0
  171. package/dist/graph/graph-executor.js +348 -0
  172. package/dist/graph/graph-executor.js.map +1 -0
  173. package/dist/graph/graph-inference.d.ts +22 -0
  174. package/dist/graph/graph-inference.d.ts.map +1 -0
  175. package/dist/graph/graph-inference.js +149 -0
  176. package/dist/graph/graph-inference.js.map +1 -0
  177. package/dist/graph/graph-store.d.ts +12 -0
  178. package/dist/graph/graph-store.d.ts.map +1 -0
  179. package/dist/graph/graph-store.js +61 -0
  180. package/dist/graph/graph-store.js.map +1 -0
  181. package/dist/graph/index.d.ts +5 -0
  182. package/dist/graph/index.d.ts.map +1 -0
  183. package/dist/graph/index.js +4 -0
  184. package/dist/graph/index.js.map +1 -0
  185. package/dist/index.d.ts +2 -0
  186. package/dist/index.d.ts.map +1 -0
  187. package/dist/index.js +837 -0
  188. package/dist/index.js.map +1 -0
  189. package/dist/intake/index.d.ts +6 -0
  190. package/dist/intake/index.d.ts.map +1 -0
  191. package/dist/intake/index.js +5 -0
  192. package/dist/intake/index.js.map +1 -0
  193. package/dist/intake/intake-processor.d.ts +17 -0
  194. package/dist/intake/intake-processor.d.ts.map +1 -0
  195. package/dist/intake/intake-processor.js +99 -0
  196. package/dist/intake/intake-processor.js.map +1 -0
  197. package/dist/intake/intake-store.d.ts +7 -0
  198. package/dist/intake/intake-store.d.ts.map +1 -0
  199. package/dist/intake/intake-store.js +7 -0
  200. package/dist/intake/intake-store.js.map +1 -0
  201. package/dist/intake/registry-poller.d.ts +41 -0
  202. package/dist/intake/registry-poller.d.ts.map +1 -0
  203. package/dist/intake/registry-poller.js +202 -0
  204. package/dist/intake/registry-poller.js.map +1 -0
  205. package/dist/intake/webhook-handlers.d.ts +37 -0
  206. package/dist/intake/webhook-handlers.d.ts.map +1 -0
  207. package/dist/intake/webhook-handlers.js +268 -0
  208. package/dist/intake/webhook-handlers.js.map +1 -0
  209. package/dist/logger.d.ts +5 -0
  210. package/dist/logger.d.ts.map +1 -0
  211. package/dist/logger.js +15 -0
  212. package/dist/logger.js.map +1 -0
  213. package/dist/mcp/resources.d.ts +9 -0
  214. package/dist/mcp/resources.d.ts.map +1 -0
  215. package/dist/mcp/resources.js +72 -0
  216. package/dist/mcp/resources.js.map +1 -0
  217. package/dist/mcp/server.d.ts +15 -0
  218. package/dist/mcp/server.d.ts.map +1 -0
  219. package/dist/mcp/server.js +20 -0
  220. package/dist/mcp/server.js.map +1 -0
  221. package/dist/mcp/tools.d.ts +9 -0
  222. package/dist/mcp/tools.d.ts.map +1 -0
  223. package/dist/mcp/tools.js +88 -0
  224. package/dist/mcp/tools.js.map +1 -0
  225. package/dist/middleware/auth.d.ts +29 -0
  226. package/dist/middleware/auth.d.ts.map +1 -0
  227. package/dist/middleware/auth.js +76 -0
  228. package/dist/middleware/auth.js.map +1 -0
  229. package/dist/middleware/permissions.d.ts +13 -0
  230. package/dist/middleware/permissions.d.ts.map +1 -0
  231. package/dist/middleware/permissions.js +32 -0
  232. package/dist/middleware/permissions.js.map +1 -0
  233. package/dist/pattern-store.d.ts +104 -0
  234. package/dist/pattern-store.d.ts.map +1 -0
  235. package/dist/pattern-store.js +299 -0
  236. package/dist/pattern-store.js.map +1 -0
  237. package/package.json +54 -0
  238. package/src/agent/debrief-retention.ts +44 -0
  239. package/src/agent/envoy-client.ts +474 -0
  240. package/src/agent/envoy-registry.ts +384 -0
  241. package/src/agent/health-checker.ts +70 -0
  242. package/src/agent/mcp-client-manager.ts +131 -0
  243. package/src/agent/stale-deployment-detector.ts +79 -0
  244. package/src/agent/step-runner.ts +124 -0
  245. package/src/agent/synth-agent.ts +1567 -0
  246. package/src/api/agent.ts +1075 -0
  247. package/src/api/api-keys.ts +129 -0
  248. package/src/api/artifacts.ts +194 -0
  249. package/src/api/auth.ts +320 -0
  250. package/src/api/deployments.ts +1347 -0
  251. package/src/api/environments.ts +97 -0
  252. package/src/api/envoy-reports.ts +159 -0
  253. package/src/api/envoys.ts +237 -0
  254. package/src/api/fleet.ts +510 -0
  255. package/src/api/graph.ts +516 -0
  256. package/src/api/health.ts +311 -0
  257. package/src/api/idp-schemas.ts +19 -0
  258. package/src/api/idp.ts +735 -0
  259. package/src/api/intake.ts +537 -0
  260. package/src/api/partitions.ts +147 -0
  261. package/src/api/progress-event-store.ts +153 -0
  262. package/src/api/schemas.ts +376 -0
  263. package/src/api/security-boundaries.ts +54 -0
  264. package/src/api/settings.ts +118 -0
  265. package/src/api/system.ts +704 -0
  266. package/src/api/telemetry.ts +32 -0
  267. package/src/api/users.ts +210 -0
  268. package/src/archive-unpacker.ts +271 -0
  269. package/src/artifact-analyzer.ts +438 -0
  270. package/src/auth/idp/index.ts +8 -0
  271. package/src/auth/idp/ldap.ts +340 -0
  272. package/src/auth/idp/oidc.ts +117 -0
  273. package/src/auth/idp/role-mapping.ts +22 -0
  274. package/src/auth/idp/saml.ts +148 -0
  275. package/src/auth/idp/types.ts +22 -0
  276. package/src/fleet/fleet-executor.ts +309 -0
  277. package/src/fleet/fleet-store.ts +13 -0
  278. package/src/fleet/index.ts +4 -0
  279. package/src/fleet/representative-selector.ts +83 -0
  280. package/src/graph/graph-executor.ts +446 -0
  281. package/src/graph/graph-inference.ts +184 -0
  282. package/src/graph/graph-store.ts +75 -0
  283. package/src/graph/index.ts +4 -0
  284. package/src/index.ts +916 -0
  285. package/src/intake/index.ts +5 -0
  286. package/src/intake/intake-processor.ts +111 -0
  287. package/src/intake/intake-store.ts +7 -0
  288. package/src/intake/registry-poller.ts +230 -0
  289. package/src/intake/webhook-handlers.ts +328 -0
  290. package/src/logger.ts +19 -0
  291. package/src/mcp/resources.ts +98 -0
  292. package/src/mcp/server.ts +34 -0
  293. package/src/mcp/tools.ts +117 -0
  294. package/src/middleware/auth.ts +103 -0
  295. package/src/middleware/permissions.ts +35 -0
  296. package/src/pattern-store.ts +409 -0
  297. package/tests/agent-mode.test.ts +536 -0
  298. package/tests/api-handlers.test.ts +1245 -0
  299. package/tests/archive-unpacker.test.ts +179 -0
  300. package/tests/artifact-analyzer.test.ts +240 -0
  301. package/tests/auth-middleware.test.ts +189 -0
  302. package/tests/decision-diary.test.ts +957 -0
  303. package/tests/diary-reader.test.ts +782 -0
  304. package/tests/envoy-client.test.ts +342 -0
  305. package/tests/envoy-reports.test.ts +156 -0
  306. package/tests/mcp-tools.test.ts +213 -0
  307. package/tests/orchestration.test.ts +536 -0
  308. package/tests/partition-deletion.test.ts +143 -0
  309. package/tests/partition-isolation.test.ts +830 -0
  310. package/tests/pattern-store.test.ts +371 -0
  311. package/tests/rbac-enforcement.test.ts +409 -0
  312. package/tests/ssrf-validation.test.ts +56 -0
  313. package/tests/stale-deployment.test.ts +85 -0
  314. package/tests/step-runner.test.ts +308 -0
  315. package/tests/ui-journey.test.ts +330 -0
  316. package/tsconfig.json +11 -0
  317. package/vitest.config.ts +27 -0
@@ -0,0 +1,334 @@
1
+ import { sanitizeForPrompt } from "@synth-deploy/core";
2
+ import { archiveFormat, unpackArchive, formatExtractedFiles } from "./archive-unpacker.js";
3
+ // ---------------------------------------------------------------------------
4
+ // Type detection
5
+ // ---------------------------------------------------------------------------
6
+ /**
7
+ * Detect artifact type from name and metadata.
8
+ * Used as a hint for the LLM and for intake routing — not for analysis.
9
+ */
10
+ export function detectArtifactType(artifact) {
11
+ if (artifact.type)
12
+ return artifact.type;
13
+ const name = artifact.name.toLowerCase();
14
+ const meta = artifact.metadata || {};
15
+ if (name === "dockerfile" || name.endsWith("/dockerfile") || meta["content-type"]?.includes("dockerfile")) {
16
+ return "dockerfile";
17
+ }
18
+ if (name === "chart.yaml" || name === "chart.yml")
19
+ return "helm-chart";
20
+ if (name === "values.yaml" || name === "values.yml")
21
+ return "helm-values";
22
+ if (name === "package.json")
23
+ return "node-package";
24
+ if (name === "makefile" || name.endsWith("/makefile"))
25
+ return "makefile";
26
+ if (name.endsWith(".tar.gz") || name.endsWith(".tgz"))
27
+ return "tarball";
28
+ if (name.endsWith(".tar"))
29
+ return "tarball";
30
+ if (name.endsWith(".zip"))
31
+ return "zip";
32
+ if (name.endsWith(".nupkg"))
33
+ return "nupkg";
34
+ if (name.endsWith(".jar") || name.endsWith(".war") || name.endsWith(".ear"))
35
+ return "java-archive";
36
+ if (name.endsWith(".whl"))
37
+ return "python-package";
38
+ if (name.endsWith(".deb"))
39
+ return "debian-package";
40
+ if (name.endsWith(".rpm"))
41
+ return "rpm-package";
42
+ if (name.endsWith(".yaml") || name.endsWith(".yml"))
43
+ return "yaml";
44
+ if (name.endsWith(".json"))
45
+ return "json";
46
+ if (name.endsWith(".sh") || name.endsWith(".bash"))
47
+ return "shell-script";
48
+ return "unknown";
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // LLM reasoning
52
+ // ---------------------------------------------------------------------------
53
+ const ANALYSIS_SYSTEM_PROMPT = `You are a deployment artifact analyzer. Given information about a deployment artifact, produce a structured analysis.
54
+
55
+ Your response must be valid JSON with these fields:
56
+ - "summary": A plain-language description (1-3 sentences) of what this artifact is and how it should be deployed.
57
+ - "dependencies": An array of strings listing runtime dependencies, system requirements, or external services needed.
58
+ - "configurationExpectations": An object mapping configuration key names to descriptions of expected values.
59
+ - "deploymentIntent": A short phrase describing the deployment method (e.g., "Container deployment via Docker Compose", "Kubernetes Helm release").
60
+ - "confidence": A number 0-1 indicating how confident you are in this analysis.
61
+
62
+ Focus on actionable deployment intelligence. Be specific about ports, environment variables, and deployment prerequisites.`;
63
+ async function analyzeWithLlm(llm, artifact, artifactType, extractedArchiveContent) {
64
+ const contentSection = extractedArchiveContent
65
+ ? `Archive contents:\n\n${sanitizeForPrompt(extractedArchiveContent)}`
66
+ : artifact.content
67
+ ? `Content:\n'''\n${sanitizeForPrompt(artifact.content.toString("utf-8").slice(0, 4000))}\n'''`
68
+ : "(no content available)";
69
+ const prompt = `Analyze this deployment artifact.
70
+
71
+ Name: ${sanitizeForPrompt(artifact.name)}
72
+ Type: ${sanitizeForPrompt(artifactType)}
73
+ Source: ${sanitizeForPrompt(artifact.source)}
74
+ Metadata: ${sanitizeForPrompt(JSON.stringify(artifact.metadata || {}))}
75
+
76
+ ${contentSection}
77
+
78
+ Produce a JSON analysis of this artifact for deployment planning purposes.`;
79
+ const result = await llm.reason({
80
+ prompt,
81
+ systemPrompt: ANALYSIS_SYSTEM_PROMPT,
82
+ promptSummary: `Artifact analysis for "${artifact.name}" (${artifactType})`,
83
+ });
84
+ if (!result.ok) {
85
+ console.warn(`[artifact-analyzer] LLM analysis failed for "${artifact.name}": ${result.reason}`);
86
+ return null;
87
+ }
88
+ try {
89
+ const jsonMatch = result.text.match(/\{[\s\S]*\}/);
90
+ if (!jsonMatch)
91
+ return null;
92
+ const parsed = JSON.parse(jsonMatch[0]);
93
+ return {
94
+ summary: parsed.summary ?? `Analysis of "${artifact.name}"`,
95
+ dependencies: parsed.dependencies ?? [],
96
+ configurationExpectations: parsed.configurationExpectations ?? {},
97
+ deploymentIntent: parsed.deploymentIntent,
98
+ confidence: typeof parsed.confidence === "number" ? parsed.confidence : 0.5,
99
+ };
100
+ }
101
+ catch {
102
+ return null;
103
+ }
104
+ }
105
+ // ---------------------------------------------------------------------------
106
+ // Pattern overlay
107
+ // ---------------------------------------------------------------------------
108
+ function applyPatternOverrides(analysis, derived) {
109
+ return {
110
+ summary: derived.summary || analysis.summary,
111
+ dependencies: derived.dependencies && derived.dependencies.length > 0
112
+ ? derived.dependencies
113
+ : analysis.dependencies,
114
+ configurationExpectations: derived.configurationExpectations
115
+ ? { ...analysis.configurationExpectations, ...derived.configurationExpectations }
116
+ : analysis.configurationExpectations,
117
+ deploymentIntent: derived.deploymentIntent || analysis.deploymentIntent,
118
+ confidence: analysis.confidence,
119
+ };
120
+ }
121
+ /**
122
+ * Artifact analysis engine.
123
+ *
124
+ * Analysis pipeline:
125
+ * 1. Check pattern store for matching corrections (if available)
126
+ * - Auto-apply if >= 2 corrections and confidence >= 0.7 (no LLM call)
127
+ * - Suggest if 1 correction or confidence < 0.7 (apply as overlay after LLM)
128
+ * 2. If LLM is unavailable, return an "unavailable" result — no silent fallback
129
+ * 3. Run LLM analysis on the raw artifact content
130
+ * 4. Apply pattern-suggest overlay if applicable
131
+ * 5. Record debrief entry with decision trail
132
+ */
133
+ export class ArtifactAnalyzer {
134
+ _llm;
135
+ _debrief;
136
+ _patternStore;
137
+ constructor(deps) {
138
+ this._llm = deps.llm;
139
+ this._debrief = deps.debrief;
140
+ this._patternStore = deps.patternStore;
141
+ }
142
+ /**
143
+ * Analyze a deployment artifact. Returns structured analysis with
144
+ * confidence score and method used.
145
+ */
146
+ async analyze(artifact) {
147
+ const artifactType = detectArtifactType(artifact);
148
+ const reasoningTrail = [];
149
+ reasoningTrail.push(`Artifact: "${artifact.name}", detected type: ${artifactType}, source: ${artifact.source}`);
150
+ // --- Step 1: Check pattern store ---
151
+ let matchedPatterns = [];
152
+ if (this._patternStore) {
153
+ matchedPatterns = this._patternStore.findMatches(artifact.source, artifactType, artifact.name);
154
+ if (matchedPatterns.length > 0) {
155
+ const autoMatch = matchedPatterns.find((m) => m.mode === "auto");
156
+ if (autoMatch) {
157
+ reasoningTrail.push(`Pattern match: "${autoMatch.pattern.namePattern}" (${autoMatch.pattern.corrections.length} corrections, confidence ${autoMatch.pattern.confidence}). Auto-applying without LLM call.`);
158
+ const analysis = {
159
+ summary: autoMatch.pattern.derivedAnalysis.summary ?? `Pattern-matched artifact "${artifact.name}"`,
160
+ dependencies: autoMatch.pattern.derivedAnalysis.dependencies ?? [],
161
+ configurationExpectations: autoMatch.pattern.derivedAnalysis.configurationExpectations ?? {},
162
+ deploymentIntent: autoMatch.pattern.derivedAnalysis.deploymentIntent,
163
+ confidence: autoMatch.pattern.confidence,
164
+ };
165
+ this._patternStore.recordApplication(autoMatch.pattern.id);
166
+ reasoningTrail.push("Pattern derived analysis applied directly.");
167
+ this._recordDebrief(artifact, artifactType, analysis, "pattern-auto", reasoningTrail);
168
+ return { analysis, method: "pattern-auto", matchedPatterns };
169
+ }
170
+ reasoningTrail.push(`Pattern suggestion available: "${matchedPatterns[0].pattern.namePattern}" ` +
171
+ `(${matchedPatterns[0].pattern.corrections.length} corrections, ` +
172
+ `confidence ${matchedPatterns[0].pattern.confidence}). ` +
173
+ `Not auto-applying — threshold not met.`);
174
+ }
175
+ }
176
+ // --- Step 2: Unpack archive if applicable ---
177
+ let extractedArchiveContent;
178
+ if (artifact.content) {
179
+ const format = archiveFormat(artifactType, artifact.name);
180
+ if (format) {
181
+ const unpacked = await unpackArchive(artifact.content, format);
182
+ extractedArchiveContent = formatExtractedFiles(unpacked);
183
+ reasoningTrail.push(`Archive unpacked (${format}): ${unpacked.files.length} text files extracted, ${unpacked.skipped} skipped.`);
184
+ }
185
+ }
186
+ // --- Step 3: Require LLM ---
187
+ if (!this._llm.isAvailable()) {
188
+ const analysis = {
189
+ summary: `Cannot analyze "${artifact.name}" — LLM is required for artifact analysis.`,
190
+ dependencies: [],
191
+ configurationExpectations: {},
192
+ confidence: 0,
193
+ };
194
+ reasoningTrail.push("LLM not available — analysis cannot proceed.");
195
+ this._recordDebrief(artifact, artifactType, analysis, "unavailable", reasoningTrail);
196
+ return { analysis, method: "unavailable" };
197
+ }
198
+ // --- Step 4: LLM analysis ---
199
+ reasoningTrail.push("LLM available — analyzing artifact.");
200
+ const llmAnalysis = await analyzeWithLlm(this._llm, artifact, artifactType, extractedArchiveContent);
201
+ if (!llmAnalysis) {
202
+ const analysis = {
203
+ summary: `Analysis of "${artifact.name}" failed — LLM returned no usable result.`,
204
+ dependencies: [],
205
+ configurationExpectations: {},
206
+ confidence: 0,
207
+ };
208
+ reasoningTrail.push("LLM returned no usable result.");
209
+ this._recordDebrief(artifact, artifactType, analysis, "unavailable", reasoningTrail);
210
+ return { analysis, method: "unavailable" };
211
+ }
212
+ reasoningTrail.push(`LLM analysis complete. Confidence: ${llmAnalysis.confidence}.`);
213
+ let analysis = llmAnalysis;
214
+ let method = "llm";
215
+ // --- Step 4: Apply pattern-suggest overlay ---
216
+ if (matchedPatterns.length > 0) {
217
+ analysis = applyPatternOverrides(analysis, matchedPatterns[0].pattern.derivedAnalysis);
218
+ method = "pattern-suggest";
219
+ reasoningTrail.push("Pattern suggestion applied as overlay on LLM analysis.");
220
+ }
221
+ this._recordDebrief(artifact, artifactType, analysis, method, reasoningTrail);
222
+ return {
223
+ analysis,
224
+ method,
225
+ matchedPatterns: matchedPatterns.length > 0 ? matchedPatterns : undefined,
226
+ };
227
+ }
228
+ /**
229
+ * Re-analyze an artifact using its stored annotations as correction context.
230
+ * Returns null if LLM is unavailable.
231
+ */
232
+ async reanalyzeWithAnnotations(artifact) {
233
+ if (!this._llm.isAvailable() || artifact.annotations.length === 0)
234
+ return null;
235
+ const correctionsText = artifact.annotations
236
+ .map((a) => `- ${a.field}: ${a.correction}`)
237
+ .join("\n");
238
+ const prompt = `An artifact's analysis has user corrections. Revise the analysis to incorporate them.
239
+
240
+ Artifact Name: ${sanitizeForPrompt(artifact.name)}
241
+ Type: ${sanitizeForPrompt(artifact.type)}
242
+
243
+ Current Analysis:
244
+ Summary: ${sanitizeForPrompt(artifact.analysis.summary)}
245
+ Dependencies: ${sanitizeForPrompt(JSON.stringify(artifact.analysis.dependencies))}
246
+ Configuration Expectations: ${sanitizeForPrompt(JSON.stringify(artifact.analysis.configurationExpectations))}
247
+ Deployment Intent: ${sanitizeForPrompt(artifact.analysis.deploymentIntent ?? "unknown")}
248
+ Confidence: ${artifact.analysis.confidence}
249
+
250
+ User Corrections:
251
+ ${sanitizeForPrompt(correctionsText)}
252
+
253
+ Produce a JSON analysis that incorporates all user corrections. Raise confidence proportional to how much the corrections clarify the artifact's purpose.`;
254
+ const result = await this._llm.reason({
255
+ prompt,
256
+ systemPrompt: ANALYSIS_SYSTEM_PROMPT,
257
+ promptSummary: `Re-analysis of "${artifact.name}" with ${artifact.annotations.length} user correction(s)`,
258
+ });
259
+ if (!result.ok)
260
+ return null;
261
+ try {
262
+ const jsonMatch = result.text.match(/\{[\s\S]*\}/);
263
+ if (!jsonMatch)
264
+ return null;
265
+ const parsed = JSON.parse(jsonMatch[0]);
266
+ const revised = {
267
+ summary: parsed.summary ?? artifact.analysis.summary,
268
+ dependencies: parsed.dependencies ?? artifact.analysis.dependencies,
269
+ configurationExpectations: parsed.configurationExpectations ?? artifact.analysis.configurationExpectations,
270
+ deploymentIntent: parsed.deploymentIntent ?? artifact.analysis.deploymentIntent,
271
+ confidence: typeof parsed.confidence === "number"
272
+ ? Math.max(parsed.confidence, artifact.analysis.confidence)
273
+ : artifact.analysis.confidence,
274
+ };
275
+ this._debrief.record({
276
+ partitionId: null,
277
+ deploymentId: null,
278
+ agent: "server",
279
+ decisionType: "artifact-analysis",
280
+ decision: `Re-analyzed "${artifact.name}" with ${artifact.annotations.length} user correction(s). Confidence: ${revised.confidence}.`,
281
+ reasoning: result.text,
282
+ context: {
283
+ artifactName: artifact.name,
284
+ corrections: correctionsText,
285
+ confidence: revised.confidence,
286
+ prompt,
287
+ },
288
+ });
289
+ return revised;
290
+ }
291
+ catch {
292
+ return null;
293
+ }
294
+ }
295
+ // -------------------------------------------------------------------------
296
+ // Debrief integration
297
+ // -------------------------------------------------------------------------
298
+ _recordDebrief(artifact, artifactType, analysis, method, reasoningTrail) {
299
+ const confidenceLabel = analysis.confidence >= 0.8
300
+ ? "high"
301
+ : analysis.confidence >= 0.5
302
+ ? "medium"
303
+ : "low";
304
+ this._debrief.record({
305
+ partitionId: null,
306
+ deploymentId: null,
307
+ agent: "server",
308
+ decisionType: "artifact-analysis",
309
+ decision: `Analyzed artifact "${artifact.name}" (${artifactType}) via ${method}. ` +
310
+ `Confidence: ${analysis.confidence} (${confidenceLabel}). ` +
311
+ `Found ${analysis.dependencies.length} dependencies, ` +
312
+ `${Object.keys(analysis.configurationExpectations).length} configuration expectations.`,
313
+ reasoning: reasoningTrail.join(" "),
314
+ context: {
315
+ artifactName: artifact.name,
316
+ artifactType,
317
+ source: artifact.source,
318
+ method,
319
+ confidence: analysis.confidence,
320
+ confidenceLabel,
321
+ dependencyCount: analysis.dependencies.length,
322
+ configExpectationCount: Object.keys(analysis.configurationExpectations).length,
323
+ deploymentIntent: analysis.deploymentIntent,
324
+ },
325
+ });
326
+ }
327
+ }
328
+ // ---------------------------------------------------------------------------
329
+ // Factory
330
+ // ---------------------------------------------------------------------------
331
+ export function createArtifactAnalyzer(deps) {
332
+ return new ArtifactAnalyzer(deps);
333
+ }
334
+ //# sourceMappingURL=artifact-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-analyzer.js","sourceRoot":"","sources":["../src/artifact-analyzer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAsB3F,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAuB;IACxD,IAAI,QAAQ,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;IAExC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;IAErC,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC1G,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,YAAY,CAAC;IACvE,IAAI,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,YAAY;QAAE,OAAO,aAAa,CAAC;IAC1E,IAAI,IAAI,KAAK,cAAc;QAAE,OAAO,cAAc,CAAC;IACnD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC;QAAE,OAAO,UAAU,CAAC;IACzE,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,SAAS,CAAC;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5C,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,cAAc,CAAC;IACnG,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,gBAAgB,CAAC;IACnD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,aAAa,CAAC;IAChD,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,MAAM,CAAC;IAC1C,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,cAAc,CAAC;IAE1E,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,MAAM,sBAAsB,GAAG;;;;;;;;;2HAS4F,CAAC;AAE5H,KAAK,UAAU,cAAc,CAC3B,GAAc,EACd,QAAuB,EACvB,YAAoB,EACpB,uBAAgC;IAEhC,MAAM,cAAc,GAAG,uBAAuB;QAC5C,CAAC,CAAC,wBAAwB,iBAAiB,CAAC,uBAAuB,CAAC,EAAE;QACtE,CAAC,CAAC,QAAQ,CAAC,OAAO;YAChB,CAAC,CAAC,kBAAkB,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,OAAO;YAC/F,CAAC,CAAC,wBAAwB,CAAC;IAE/B,MAAM,MAAM,GAAG;;QAET,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAChC,iBAAiB,CAAC,YAAY,CAAC;UAC7B,iBAAiB,CAAC,QAAQ,CAAC,MAAM,CAAC;YAChC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;;EAEpE,cAAc;;2EAE2D,CAAC;IAE1E,MAAM,MAAM,GAAc,MAAM,GAAG,CAAC,MAAM,CAAC;QACzC,MAAM;QACN,YAAY,EAAE,sBAAsB;QACpC,aAAa,EAAE,0BAA0B,QAAQ,CAAC,IAAI,MAAM,YAAY,GAAG;KAC5E,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,gDAAgD,QAAQ,CAAC,IAAI,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACjG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACnD,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAMrC,CAAC;QAEF,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,gBAAgB,QAAQ,CAAC,IAAI,GAAG;YAC3D,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;YACvC,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,IAAI,EAAE;YACjE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,UAAU,EAAE,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG;SAC5E,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,kBAAkB;AAClB,8EAA8E;AAE9E,SAAS,qBAAqB,CAC5B,QAA0B,EAC1B,OAAwB;IAExB,OAAO;QACL,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC,OAAO;QAC5C,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;YACnE,CAAC,CAAC,OAAO,CAAC,YAAY;YACtB,CAAC,CAAC,QAAQ,CAAC,YAAY;QACzB,yBAAyB,EAAE,OAAO,CAAC,yBAAyB;YAC1D,CAAC,CAAC,EAAE,GAAG,QAAQ,CAAC,yBAAyB,EAAE,GAAG,OAAO,CAAC,yBAAyB,EAAE;YACjF,CAAC,CAAC,QAAQ,CAAC,yBAAyB;QACtC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,QAAQ,CAAC,gBAAgB;QACvE,UAAU,EAAE,QAAQ,CAAC,UAAU;KAChC,CAAC;AACJ,CAAC;AAYD;;;;;;;;;;;GAWG;AACH,MAAM,OAAO,gBAAgB;IACV,IAAI,CAAY;IAChB,QAAQ,CAAgB;IACxB,aAAa,CAAgB;IAE9C,YAAY,IAA0B;QACpC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC;IACzC,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,QAAuB;QACnC,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAClD,MAAM,cAAc,GAAa,EAAE,CAAC;QAEpC,cAAc,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,IAAI,qBAAqB,YAAY,aAAa,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAEhH,sCAAsC;QACtC,IAAI,eAAe,GAAmB,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,eAAe,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,CAC9C,QAAQ,CAAC,MAAM,EACf,YAAY,EACZ,QAAQ,CAAC,IAAI,CACd,CAAC;YAEF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACjE,IAAI,SAAS,EAAE,CAAC;oBACd,cAAc,CAAC,IAAI,CACjB,mBAAmB,SAAS,CAAC,OAAO,CAAC,WAAW,MAAM,SAAS,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,4BAA4B,SAAS,CAAC,OAAO,CAAC,UAAU,oCAAoC,CACvL,CAAC;oBAEF,MAAM,QAAQ,GAAqB;wBACjC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,IAAI,6BAA6B,QAAQ,CAAC,IAAI,GAAG;wBACnG,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,YAAY,IAAI,EAAE;wBAClE,yBAAyB,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,yBAAyB,IAAI,EAAE;wBAC5F,gBAAgB,EAAE,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,gBAAgB;wBACpE,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,UAAU;qBACzC,CAAC;oBAEF,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;oBAC3D,cAAc,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;oBAElE,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,CAAC,CAAC;oBAEtF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC;gBAC/D,CAAC;gBAED,cAAc,CAAC,IAAI,CACjB,kCAAkC,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,IAAI;oBAC5E,IAAI,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,gBAAgB;oBACjE,cAAc,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK;oBACxD,wCAAwC,CACzC,CAAC;YACJ,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,IAAI,uBAA2C,CAAC;QAChD,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,aAAa,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC1D,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC/D,uBAAuB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;gBACzD,cAAc,CAAC,IAAI,CACjB,qBAAqB,MAAM,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,0BAA0B,QAAQ,CAAC,OAAO,WAAW,CAC5G,CAAC;YACJ,CAAC;QACH,CAAC;QAED,8BAA8B;QAE9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YAC7B,MAAM,QAAQ,GAAqB;gBACjC,OAAO,EAAE,mBAAmB,QAAQ,CAAC,IAAI,4CAA4C;gBACrF,YAAY,EAAE,EAAE;gBAChB,yBAAyB,EAAE,EAAE;gBAC7B,UAAU,EAAE,CAAC;aACd,CAAC;YAEF,cAAc,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;YACpE,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;YAErF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAC7C,CAAC;QAED,+BAA+B;QAC/B,cAAc,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;QAC3D,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,uBAAuB,CAAC,CAAC;QAErG,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAqB;gBACjC,OAAO,EAAE,gBAAgB,QAAQ,CAAC,IAAI,2CAA2C;gBACjF,YAAY,EAAE,EAAE;gBAChB,yBAAyB,EAAE,EAAE;gBAC7B,UAAU,EAAE,CAAC;aACd,CAAC;YAEF,cAAc,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;YACtD,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;YAErF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;QAC7C,CAAC;QAED,cAAc,CAAC,IAAI,CAAC,sCAAsC,WAAW,CAAC,UAAU,GAAG,CAAC,CAAC;QAErF,IAAI,QAAQ,GAAG,WAAW,CAAC;QAC3B,IAAI,MAAM,GAA6B,KAAK,CAAC;QAE7C,gDAAgD;QAChD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/B,QAAQ,GAAG,qBAAqB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YACvF,MAAM,GAAG,iBAAiB,CAAC;YAC3B,cAAc,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;QAChF,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;QAE9E,OAAO;YACL,QAAQ;YACR,MAAM;YACN,eAAe,EAAE,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,SAAS;SAC1E,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,wBAAwB,CAAC,QAAkB;QAC/C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAE/E,MAAM,eAAe,GAAG,QAAQ,CAAC,WAAW;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,UAAU,EAAE,CAAC;aAC3C,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,MAAM,GAAG;;iBAEF,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;QACzC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;;;WAG7B,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBACvC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;8BACnD,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC;qBACvF,iBAAiB,CAAC,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,IAAI,SAAS,CAAC;cACzE,QAAQ,CAAC,QAAQ,CAAC,UAAU;;;EAGxC,iBAAiB,CAAC,eAAe,CAAC;;0JAEsH,CAAC;QAEvJ,MAAM,MAAM,GAAc,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;YAC/C,MAAM;YACN,YAAY,EAAE,sBAAsB;YACpC,aAAa,EAAE,mBAAmB,QAAQ,CAAC,IAAI,UAAU,QAAQ,CAAC,WAAW,CAAC,MAAM,qBAAqB;SAC1G,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE;YAAE,OAAO,IAAI,CAAC;QAE5B,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YACnD,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAC;YAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAMrC,CAAC;YAEF,MAAM,OAAO,GAAqB;gBAChC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO;gBACpD,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,QAAQ,CAAC,QAAQ,CAAC,YAAY;gBACnE,yBAAyB,EAAE,MAAM,CAAC,yBAAyB,IAAI,QAAQ,CAAC,QAAQ,CAAC,yBAAyB;gBAC1G,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,IAAI,QAAQ,CAAC,QAAQ,CAAC,gBAAgB;gBAC/E,UAAU,EAAE,OAAO,MAAM,CAAC,UAAU,KAAK,QAAQ;oBAC/C,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;oBAC3D,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU;aACjC,CAAC;YAEF,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACnB,WAAW,EAAE,IAAI;gBACjB,YAAY,EAAE,IAAI;gBAClB,KAAK,EAAE,QAAQ;gBACf,YAAY,EAAE,mBAAmB;gBACjC,QAAQ,EAAE,gBAAgB,QAAQ,CAAC,IAAI,UAAU,QAAQ,CAAC,WAAW,CAAC,MAAM,oCAAoC,OAAO,CAAC,UAAU,GAAG;gBACrI,SAAS,EAAE,MAAM,CAAC,IAAI;gBACtB,OAAO,EAAE;oBACP,YAAY,EAAE,QAAQ,CAAC,IAAI;oBAC3B,WAAW,EAAE,eAAe;oBAC5B,UAAU,EAAE,OAAO,CAAC,UAAU;oBAC9B,MAAM;iBACP;aACF,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,sBAAsB;IACtB,4EAA4E;IAEpE,cAAc,CACpB,QAAuB,EACvB,YAAoB,EACpB,QAA0B,EAC1B,MAAgC,EAChC,cAAwB;QAExB,MAAM,eAAe,GACnB,QAAQ,CAAC,UAAU,IAAI,GAAG;YACxB,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,QAAQ,CAAC,UAAU,IAAI,GAAG;gBAC1B,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,KAAK,CAAC;QAEd,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,IAAI;YAClB,KAAK,EAAE,QAAQ;YACf,YAAY,EAAE,mBAAmB;YACjC,QAAQ,EAAE,sBAAsB,QAAQ,CAAC,IAAI,MAAM,YAAY,SAAS,MAAM,IAAI;gBAChF,eAAe,QAAQ,CAAC,UAAU,KAAK,eAAe,KAAK;gBAC3D,SAAS,QAAQ,CAAC,YAAY,CAAC,MAAM,iBAAiB;gBACtD,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,MAAM,8BAA8B;YACzF,SAAS,EAAE,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC;YACnC,OAAO,EAAE;gBACP,YAAY,EAAE,QAAQ,CAAC,IAAI;gBAC3B,YAAY;gBACZ,MAAM,EAAE,QAAQ,CAAC,MAAM;gBACvB,MAAM;gBACN,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,eAAe;gBACf,eAAe,EAAE,QAAQ,CAAC,YAAY,CAAC,MAAM;gBAC7C,sBAAsB,EAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,yBAAyB,CAAC,CAAC,MAAM;gBAC9E,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB;aAC5C;SACF,CAAC,CAAC;IACL,CAAC;CACF;AAED,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,MAAM,UAAU,sBAAsB,CAAC,IAA0B;IAC/D,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type { IdpAdapter } from "./types.js";
2
+ export { OidcAdapter } from "./oidc.js";
3
+ export type { OidcAuthenticateParams } from "./oidc.js";
4
+ export { SamlAdapter } from "./saml.js";
5
+ export type { SamlConfig, SamlAuthenticateParams } from "./saml.js";
6
+ export { LdapAdapter } from "./ldap.js";
7
+ export type { LdapConfig, LdapAuthenticateParams } from "./ldap.js";
8
+ export { applyRoleMappings } from "./role-mapping.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/auth/idp/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,YAAY,EAAE,UAAU,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { OidcAdapter } from "./oidc.js";
2
+ export { SamlAdapter } from "./saml.js";
3
+ export { LdapAdapter } from "./ldap.js";
4
+ export { applyRoleMappings } from "./role-mapping.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/idp/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,56 @@
1
+ import type { IdpUser } from "@synth-deploy/core";
2
+ import type { IdpAdapter } from "./types.js";
3
+ export interface LdapConfig {
4
+ url: string;
5
+ bindDn: string;
6
+ bindCredential: string;
7
+ searchBase: string;
8
+ searchFilter: string;
9
+ groupSearchBase: string;
10
+ groupSearchFilter: string;
11
+ useTls: boolean;
12
+ tlsCaPath?: string;
13
+ }
14
+ export interface LdapAuthenticateParams {
15
+ username: string;
16
+ password: string;
17
+ config: LdapConfig;
18
+ }
19
+ /**
20
+ * LDAP/Active Directory adapter -- implements IdpAdapter for LDAP-based identity providers.
21
+ *
22
+ * Authentication flow:
23
+ * 1. Bind with service account credentials
24
+ * 2. Search for the user by username
25
+ * 3. Bind with the user's DN + provided password
26
+ * 4. Query group memberships (supports AD nested groups via matching rule OID)
27
+ * 5. Return IdpUser
28
+ */
29
+ export declare class LdapAdapter implements IdpAdapter {
30
+ type: string;
31
+ authenticate(params: unknown): Promise<IdpUser>;
32
+ validateConfig(config: unknown): Promise<{
33
+ valid: boolean;
34
+ error?: string;
35
+ }>;
36
+ /**
37
+ * Tests the LDAP connection by attempting a service account bind.
38
+ * Returns success/error without authenticating any user.
39
+ */
40
+ testConnection(config: LdapConfig): Promise<{
41
+ success: boolean;
42
+ error?: string;
43
+ }>;
44
+ /**
45
+ * Tests whether a specific user can be found in the LDAP directory.
46
+ * Uses the service account to search — does not authenticate the user.
47
+ */
48
+ testUser(config: LdapConfig, username: string): Promise<{
49
+ found: boolean;
50
+ userDn?: string;
51
+ email?: string;
52
+ displayName?: string;
53
+ error?: string;
54
+ }>;
55
+ }
56
+ //# sourceMappingURL=ldap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ldap.d.ts","sourceRoot":"","sources":["../../../src/auth/idp/ldap.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,UAAU,CAAC;CACpB;AA4FD;;;;;;;;;GASG;AACH,qBAAa,WAAY,YAAW,UAAU;IAC5C,IAAI,SAAU;IAER,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IA4F/C,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAiDlF;;;OAGG;IACG,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBvF;;;OAGG;IACG,QAAQ,CACZ,MAAM,EAAE,UAAU,EAClB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAmCtG"}